私は同僚のシェルコードを見ていましたが、次のようなものを見ました。
date 2&>$0
日付が何であるかはわかりますが、2&> $ 0は何をしていますか?しばらく外出しているので、この部分が何なのかは尋ねられません。
答え1
投稿したコードが正しいと仮定すると、奇妙なことが起こります。それ:
- 走る
date 2
、これは有効な呼び出しではなく、date
エラーメッセージを生成します。 - 標準出力と標準エラーをリダイレクトします。そして
&>
、 - 実行中のスクリプトを含むファイルに移動します(
$0
)、既存のコンテンツを削除してください。
Bashがスクリプトを読み取る方法はファイルから一度に1行をインポートするため、上書きされたファイルから意味のないコンテンツを取得して終了します(ファイルがその行が表示される点よりも短く切り捨てられたため)。 )またはgive文法エラーが発生します(元のテキストが非常に短く、一部のエラーが次の行に読み込まれる場合)。
私はその行に対するどんな正当な使用も考えることはできませんが、あなたが言ったように、あなたはそれが書かれているように正確に提供し、それがまさにそれです。
厳密に言えば、他の値を割り当てることができるので、$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)のすべての出力はfileにリダイレクトされます
$0
。$0
このシンボルは
>
デフォルトでstdoutのリダイレクトを表します。拡張機能として、bash
記号は&>
リダイレクトを表すショートカットです。両方標準出力と標準エラー。したがって、stdoutとstderrは両方ともファイルにリダイレクトされます$0
。スクリプトファイルを上書きすると、有効なスクリプトではなくなり、誤ったコマンド
bash
でエラーが発生します。
bash
POSIXシェルとPOSIXシェルの違い
たとえば、単純なPOSIXシェルの場合、ショートカットはdash
サポートされていません。&>
したがって、コマンドはdate 2&>$0
リダイレクトされます。ただファイルへの標準出力$0
。これは、スクリプトファイルを空のファイルで上書きし、date
端末にエラーメッセージが表示されることを意味します。