データをbashにパイプすると、「$ 0」はどうなりますか?

データをbashにパイプすると、「$ 0」はどうなりますか?

次のようなbashファイルがあるとしましょう。

cd $(dirname "$0");

ファイルを直接実行するのではなく、ファイルを読み込んでからbashを介してパイプする場合はどうなりますか? 「$0」をどのように説明しますか?

echo "$(cat <file>)" | bash

私が尋ねる理由は、ファイルが以前の場所で実行される必要がないため、$ 0が何を意味するのか不明瞭に見えるからです。たぶんbashはそれがどこにあるのか覚えていて、$ 0はまだ元のファイルの場所を参照していますか?そうは思えません。

ベストアンサー1

$0次に、bashが呼び出される名前は次のとおりです。

$ printf '%s\n' 'echo $0' | bash
bash
$ printf '%s\n' 'echo $0' | ARGV0=sh bash
sh
$ printf '%s\n' 'echo $0' | ARGV0='blah blah' bash
blah blah

2番目と3番目のコマンドはzshで実行され、特殊変数を使用して0番目の引数を設定できますARGV0。ただし、シンボリックリンクを使用してシミュレートできます。

$ ln -s "$(command -v bash)" foo
$ printf '%s\n' 'echo $0' | ./foo
./foo

~からバッシュマニュアル:

($ 0)はシェルまたはシェルスクリプトの名前に展開されます。これはシェルが初期化されるときに設定されます。コマンドファイルを使用してBashを呼び出す(参照) シェルスクリプト)、$0ファイル名に設定します。 Bashがこのオプションで始まる-c(参照バッシュに電話する$0実行される文字列の後の最初の引数(存在する場合)に設定されます。それ以外の場合は、引数0で指定されたようにBashを呼び出すために使用されるファイル名に設定されます。

おすすめ記事