
同僚のシェルコードを見ていたら、次のようなことが分かりました。
date 2&>$0
date が何をするのかは分かっていますが、2&>$0 は何をしていますか? 彼はしばらく外出中なので、この部分が何についてのものだったのか尋ねることができません。
答え1
あなたが投稿したコードが正しいと仮定すると、その動作は非常に奇妙です。
- 実行
date 2
は、の有効な呼び出しではなくdate
、エラーメッセージを生成するので、 - 標準出力と標準エラー出力の両方をリダイレクトしますと
&>
、 - 実行中のスクリプトを含むファイル(
$0
)、既存の内容を消去します。
Bash がスクリプトを読み込む方法は、ファイルから一度に 1 行ずつ取得することであるため、上書きされたファイルから意味不明な内容が取得され、おそらく終了する (ファイルがこの行が表示された時点よりも短く切り捨てられているため) か、構文エラーが発生する (元のファイルが非常に短く、エラーの一部が次の行として読み込まれる場合) ことになります。
その行の正当な使用法は一つも思いつきませんが、あなたが書かれているとおりに正確に説明したので、それがその行の機能です。
厳密に言えば、 に別の値を与えて、オプション:$0
を指定して Bash を呼び出すことでこのコードを非破壊的に実行することは可能です。この場合、はエラー メッセージを に入れますが、そうするのはまったく不合理です。-c
bash -c "$(<test.bash)" output-file
output-file
答え2
まとめ
ではbash
、そのコマンドがスクリプト内にある場合、スクリプト ファイルはエラー メッセージで上書きされます。
例
次のスクリプトを検討してください:
$ cat test.sh
date 2&>$0
次に、スクリプトを実行します。
$ bash test.sh
test.sh: line 2: unexpected EOF while looking for matching ``'
test.sh: line 3: syntax error: unexpected end of file
スクリプトの新しい内容を確認します。
$ cat test.sh
date: invalid date `2'
説明
コマンドはdate 2&>$0
次のように解釈されます。
コマンドは
date
引数付きで実行されます2
date コマンドからのすべての出力 (stdout と stderr の両方) は、ファイルにリダイレクトされます
$0
。$0
は現在のスクリプトの名前です。シンボルは
>
、デフォルトではstdoutのリダイレクトを示します。bash
拡張として、シンボルは&>
、リダイレクトのショートカットを示します。両方stdout と stderr。その結果、stdout と stderr の両方がファイルにリダイレクトされます$0
。スクリプト ファイルが上書きされると、有効なスクリプトではなくなり、
bash
不正なコマンドに関するエラーが発生します。
bash
とPOSIXシェルの違い
のような単純なPOSIXシェルでは、dash
ショートカット&>
はサポートされていません。そのため、コマンドはdate 2&>$0
リダイレクトされます。のみstdout をファイルに出力します$0
。この場合、スクリプト ファイルは空のファイルで上書きされ、date
エラー メッセージがターミナルに表示されます。