「日付2&> $ 0」は何をしますか?

「日付2&> $ 0」は何をしますか?

私は同僚のシェルコードを見ていましたが、次のようなものを見ました。

date 2&>$0

日付が何であるかはわかりますが、2&> $ 0は何をしていますか?しばらく外出しているので、この部分が何なのかは尋ねられません。

答え1

投稿したコードが正しいと仮定すると、奇妙なことが起こります。それ:

  • 走るdate 2、これは有効な呼び出しではなく、dateエラーメッセージを生成します。
  • 標準出力と標準エラーをリダイレクトします。そして&>
  • 実行中のスクリプトを含むファイルに移動します($0)、既存のコンテンツを削除してください。

Bashがスクリプトを読み取る方法はファイルから一度に1行をインポートするため、上書きされたファイルから意味のないコンテンツを取得して終了します(ファイルがその行が表示される点よりも短く切り捨てられたため)。 )またはgive文法エラーが発生します(元のテキストが非常に短く、一部のエラーが次の行に読み込まれる場合)。

私はその行に対するどんな正当な使用も考えることはできませんが、あなたが言ったように、あなたはそれが書かれているように正確に提供し、それがまさにそれです。


厳密に言えば、他の値を割り当てることができるので、$0次のオプションでBashを呼び出してこのコードを非破壊的に実行することができます-cbash -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次のように説明されます。

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

  2. dateコマンド(stdoutとstderr)のすべての出力はfileにリダイレクトされます$0$0

    このシンボルは>デフォルトでstdoutのリダイレクトを表します。拡張機能として、bash記号は&>リダイレクトを表すショートカットです。両方標準出力と標準エラー。したがって、stdoutとstderrは両方ともファイルにリダイレクトされます$0

  3. スクリプトファイルを上書きすると、有効なスクリプトではなくなり、誤ったコマンドbashでエラーが発生します。

bashPOSIXシェルとPOSIXシェルの違い

たとえば、単純なPOSIXシェルの場合、ショートカットはdashサポートされていません。&>したがって、コマンドはdate 2&>$0リダイレクトされます。ただファイルへの標準出力$0。これは、スクリプトファイルを空のファイルで上書きし、date端末にエラーメッセージが表示されることを意味します。

関連情報