6

Advanced Bash-Scripting Guide の第 2 章を読んでいて、このスクリプトについて脚注で読んでいました。

#!/bin/rm
# Self-deleting script.

# Nothing much seems to happen when you run this... except that the file disappears.

WHATEVER=85

echo "This line will never print (betcha!)."

exit $WHATEVER  # Doesn't matter. The script will not exit here.
                # Try an echo $? after script termination.
                # You'll get a 0, not a 85.

通常rm、引数を取り、そのファイルを削除します。ここでは、rm実行中のスクリプトに基づいて行動することをどういうわけか知っています。これは、シェルが に遭遇すると#!、そのファイルへの (完全修飾された?) パスを、 の後に指定されたプログラムへの引数として渡すことを意味します#!か?

4

4 に答える 4

4

スクリプト ファイルの名前がfooで、シバンで始まるとします。

#!/bin/sh 

スクリプトを実行すると、次のように実行されます。

/bin/sh foo

あなたの例では、シバンは次のとおりです。

#!/bin/rm

つまり、次のようにスクリプトを実行するかのようです。

/bin/rm foo

その結果、それ自体が削除されます。

于 2013-09-05T05:24:24.973 に答える
3

はい、「#! の後に指定されたプログラムへの引数として、そのファイルへの (完全修飾された?) パスを渡す」と言うとき、あなたはまさにその通りです。

これが、シェル スクリプトが または で始まる理由#!/bin/shであり、Python スクリプトは のようなもので始まり#!/usr/local/bin/pythonます。

「shebang」行は、スクリプトのインタープリターを実行することを目的としていますが、任意の実行可能ファイルを指定できます。

于 2013-09-05T05:24:03.183 に答える
2

スクリプトにシバンが含まれていて、次のように実行する場合:

./path/to/script

プログラムローダーは、引数としてスクリプトへのパスを使用して、シバン行で指定されたパスを実行するように指示されます。

あなたの場合、スクリプトは#!/bin/rm最初の行として含まれており、言って実行します

./selfdeletingscript.sh

以下が実行されます。

/bin/rm ./selfdeletingscript.sh

さらに、次のように言ってスクリプトを実行していることに気付いたかもしれません。

/bin/sh ./selfdeletingscript.sh

また

bash ./selfdeletingscript.sh

インタープリターへのパスを指定したため、削除しません。

于 2013-09-05T05:25:28.727 に答える
1

はい、bash はスクリプトを次のように実行します。

/bin/rm <Name of script file> [Optional arguments]

bashのmanページから

プログラムが #! で始まるファイルの場合、最初の行の残りの部分でプログラムのインタープリターを指定します。シェルは、この実行可能形式自体を処理しないオペレーティング システムで、指定されたインタープリターを実行します。インタープリターへの引数は、プログラムの最初の行のインタープリター名に続く単一のオプションの引数で構成され、その後にプログラムの名前が続き、その後にコマンド引数 (存在する場合) が続きます。

于 2013-09-05T05:31:59.220 に答える