`date 2&>$0` は何をしますか?

`date 2&>$0` は何をしますか?

同僚のシェルコードを見ていたら、次のようなことが分かりました。

date 2&>$0

date が何をするのかは分かっていますが、2&>$0 は何をしていますか? 彼はしばらく外出中なので、この部分が何についてのものだったのか尋ねることができません。

答え1

あなたが投稿したコードが正しいと仮定すると、その動作は非常に奇妙です。

  • 実行date 2は、の有効な呼び出しではなくdate、エラーメッセージを生成するので、
  • 標準出力と標準エラー出力の両方をリダイレクトします&>
  • 実行中のスクリプトを含むファイル($0)、既存の内容を消去します。

Bash がスクリプトを読み込む方法は、ファイルから一度に 1 行ずつ取得することであるため、上書きされたファイルから意味不明な内容が取得され、おそらく終了する (ファイルがこの行が表示された時点よりも短く切り捨てられているため) か、構文エラーが発生する (元のファイルが非常に短く、エラーの一部が次の行として読み込まれる場合) ことになります。

その行の正当な使用法は一つも思いつきませんが、あなたが書かれているとおりに正確に説明したので、それがその行の機能です。


厳密に言えば、 に別の値を与えて、オプション:$0を指定して Bash を呼び出すことでこのコードを非破壊的に実行することは可能です。この場合、はエラー メッセージを に入れますが、そうするのはまったく不合理です。-cbash -c "$(<test.bash)" output-fileoutput-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次のように解釈されます。

  1. コマンドはdate引数付きで実行されます2

  2. date コマンドからのすべての出力 (stdout と stderr の両方) は、ファイルにリダイレクトされます$0$0は現在のスクリプトの名前です。

    シンボルは>、デフォルトではstdoutのリダイレクトを示します。bash拡張として、シンボルは&>、リダイレクトのショートカットを示します。両方stdout と stderr。その結果、stdout と stderr の両方がファイルにリダイレクトされます$0

  3. スクリプト ファイルが上書きされると、有効なスクリプトではなくなり、bash不正なコマンドに関するエラーが発生します。

bashとPOSIXシェルの違い

のような単純なPOSIXシェルでは、dashショートカット&>はサポートされていません。そのため、コマンドはdate 2&>$0リダイレクトされます。のみstdout をファイルに出力します$0。この場合、スクリプト ファイルは空のファイルで上書きされ、dateエラー メッセージがターミナルに表示されます。

関連情報