Zsh
為什麼IFS需要echo才能在zsh中生效?
我正在嘗試
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
)也可能會破壞反斜杠。)