遺留系統之一升級到bash4,其大部分腳本停止工作。我已經縮小到如何在<(cmdA ...|cmdB ... file{1,2}|cmdZ ...)
內展開大括號。爲什麼bash4以不同的方式擴展大括號?
爲了說明差異更好:
BEFORE(3.2.25慶典):
[[email protected]:~]$ bash -version|head -1
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
[[email protected]:~]$ cat <(echo sort file{1,2})
sort file1
sort file2
[[email protected]:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort)
[[email protected]:~]$
AFTER(bash的4.1.2):
[[email protected]:~]$ bash --version|head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
[[email protected]:~]$ cat <(echo sort file{1,2})
sort file1 file2
[[email protected]:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort)
join: missing operand after `/dev/fd/63'
Try `join --help' for more information.
[[email protected]:~]$
它是一個「硬編碼「(和預期?)更改爲bash4?或者是這種擴展的行爲受某些bash級設置(如set -B
/set +B
)控制,並且可以切換回舊/ legacy/bash3模式?我寧願改變一些shell的開關(而不是重寫一堆腳本)。
如果這(bash3)「功能」是一個bug修正或改進過程中切斷 - 我很驚訝,因爲舊的(bash3)語法允許以節省打字一噸......
哦,等一下。你期望生成兩個不同的*進程替換*,而不是'sed'的兩個參數?我不知道那是**有史以來**符合正確的,記錄在案的行爲......也就是說,AFAIK,你的代碼取決於一個錯誤。 –
@CharlesDuffy - 這就是它一直工作的原因(對於我和腳本),直到bash4升級 - <(cmd {a,b})'確實展開爲兩個<(cmd a)<(cmd b)'並且通過加入/等等。這些腳本廣泛使用此功能,將其嵌套到多個級別並對腳本進行測試(不想用胖手指觸摸它併產生新的錯誤)。 – Vlad
@Vlad這看起來像一個bug,他們在Bash 4中修復了這個bug。你應該期望'<(...)'裏面的命令與任何其他命令一樣被解析,所以'<(cmd {a,b} )'應該等於'<(cmd ab)'。 – Barmar