
我正在查看同事的 shell 程式碼,我看到了這個:
date 2&>$0
我知道 date 的作用,但 2&>$0 在做什麼?他出去有一段時間了,所以我不能問他這部分是關於什麼的。
答案1
假設您發布的程式碼是正確的,它的作用很奇怪。它:
因為 Bash 讀取腳本的方式是一次從文件中獲取一行,這會導致它從覆蓋的文件中獲取無意義的內容,並可能退出(因為文件已被截斷為比該行出現的點短)或給出語法錯誤(如果原文非常短且部分錯誤被讀入下一行)。
我想不出該行的任何合法用途,但正如您所說,您已經完全按照書面形式給出了它,這就是它的作用。
嚴格來說,可以為 賦予另一個值,$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 都被重新導向到檔案$0
。一旦腳本檔案被覆蓋,它就不再是有效的腳本,並且
bash
抱怨格式錯誤的命令。
bash
和 POSIX shell之間的區別
對於簡單的 POSIX shell,例如,不支援dash
快捷方式。&>
因此,該命令date 2&>$0
將重定向僅有的標準輸出到文件$0
。在這種情況下,這意味著腳本檔案被空檔案覆蓋,同時date
錯誤訊息將出現在終端上。