`date 2&>$0` 有什麼作用?

`date 2&>$0` 有什麼作用?

我正在查看同事的 shell 程式碼,我看到了這個:

date 2&>$0

我知道 date 的作用,但 2&>$0 在做什麼?他出去有一段時間了,所以我不能問他這部分是關於什麼的。

答案1

假設您發布的程式碼是正確的,它的作用很奇怪。它:

  • 跑步date 2,這不是有效的調用date,並且會產生錯誤訊息,然後
  • 重定向其標準輸出和標準錯誤&>,
  • 進入包含運行腳本的檔案($0),刪除其現有內容。

因為 Bash 讀取腳本的方式是一次從文件中獲取一行,這會導致它從覆蓋的文件中獲取無意義的內容,並可能退出(因為文件已被截斷為比該行出現的點短)或給出語法錯誤(如果原文非常短且部分錯誤被讀入下一行)。

我想不出該行的任何合法用途,但正如您所說,您已經完全按照書面形式給出了它,這就是它的作用。


嚴格來說,可以為 賦予另一個值,$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)都被重定向到檔案$0. $0是目前腳本的名稱。

    該符號>表示預設情況下 stdout 的重定向。作為bash擴展,該符號&>是一個快捷方式指示重定向兩個都標準輸出和標準誤差。因此,stdout 和 stderr 都被重新導向到檔案$0

  3. 一旦腳本檔案被覆蓋,它就不再是有效的腳本,並且bash抱怨格式錯誤的命令。

bash和 POSIX shell之間的區別

對於簡單的 POSIX shell,例如,不支援dash快捷方式。&>因此,該命令date 2&>$0將重定向僅有的標準輸出到文件$0。在這種情況下,這意味著腳本檔案被空檔案覆蓋,同時date錯誤訊息將出現在終端上。

相關內容