Zsh

為什麼IFS需要echo才能在zsh中生效?

  • August 9, 2021

我正在嘗試PATH使用 zsh 5.8 將成員讀入數組。我習慣了 Bash,以下通常有效:

IFS=: p=($PATH)

但是對於 zsh,這實際上給了我一個只有一個項目的數組。如果我改為寫:

IFS=: p=($(echo $PATH))

然後我得到正確數量的元素。這是為什麼?

因為 zsh 預設情況下不對參數擴展進行分詞,這與 POSIXy shell 不同。它適用於命令替換,因此通過一個“修復”它的往返行程為您。但是在 zsh 中做這件事還很不正確,echo在某些情況下,命令替換的組合甚至可能會破壞數據。

在 zsh 中,您可以使用$=PATH要求分詞,或使用此處提供的更合適的解決方案:How to split a string by ‘:’ character in bash/zsh?

同樣在 的情況下PATH,預設情況下它與 zsh 中的數組變數綁定path,因此您無需執行任何操作即可將其作為數組訪問。


(在IFS=: p=($PATH)中,未引用的擴展也將受到文件名生成或萬用字元的影響,因此如果其中的任何路徑PATH碰巧包含萬用字元(*?[],也許還有其他),結果可能不是您想要的。通過命令替換往返並且echo還會刪除任何尾隨的換行符,並且(取決於echo)也可能會破壞反斜杠。)

引用自:https://unix.stackexchange.com/questions/663963