Bash
為什麼命令中的變數擴展在 ZSH 中不起作用但在 BASH 中起作用?
我設置了一個環境變數,想在呼叫命令時使用它,但沒有骰子。
沒有變數的完整命令有效:
nacho@WouldntYouLikeToKnow ~ % ls -la ~/Downloads total 8675309 drwx------+ 16 nacho staff 512 Sep 28 10:30 . drwxr-x---+ 29 nacho staff 928 Sep 29 10:39 ..
現在我設置了一個變數並嘗試使用它,但它失敗了:
nacho@WouldntYouLikeToKnow ~ % export testing="-la ~/Downloads" nacho@WouldntYouLikeToKnow ~ % ls $testing ls: invalid option -- usage: ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when] [-D format] [file ...]
將幾個單獨的字元串(參數)填充到一個字元串中幾乎總是錯誤的方法,至少如果您需要再次提取這些單獨的字元串。
您正在執行的操作在
bash
shell 中有效(假設您使用$HOME
了~
,因為 shell 不會在雙引號內進行波浪號擴展),因為它會將未加引號的變數擴展拆分為字元串中的空格字元(在$IFS
;中的任何字元上)也將文件名通配應用於生成的單詞),而zsh
shell 不這樣做。請注意,它僅適用於您的字元串
bash
中沒有其他空格、製表符或換行符,並且該字元串也不包含文件名萬用字元。例如,如果路徑名中有空格,或者如果您想bash
列出名為*
.在兩個 shell 的變數中儲存單獨的命令行參數的正確方法是使用數組:
args=( -la ~/Downloads )
或者
args=( -l -A ~/Library/'Application Support' )
在
bash
外殼中,您將使用它作為ls "${args[@]}"
在這裡,
"${args[@]}"
展開為由數組元素組成的列表args
,每個元素都單獨引用。在
zsh
shell 中,你可以做同樣的事情或者只是使用ls $args
在這裡,
zsh
shell 會將數組擴展args
為單獨的元素,每個元素都變成 的參數ls
,但它不會(預設情況下)拆分這些元素或對它們應用文件名萬用字元。這些範例還保留波浪號不加引號,允許 shell 將其擴展為使用者主目錄的路徑名。這種擴展會在分配給
args
數組時發生,而不是在使用值時發生。有關的: