Bash

為什麼命令中的變數擴展在 ZSH 中不起作用但在 BASH 中起作用?

  • September 29, 2022

我設置了一個環境變數,想在呼叫命令時使用它,但沒有骰子。

沒有變數的完整命令有效:

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 ...]

將幾個單獨的字元串(參數)填充到一個字元串中幾乎總是錯誤的方法,至少如果您需要再次提取這些單獨的字元串。

您正在執行的操作在bashshell 中有效(假設您使用$HOME~,因為 shell 不會在雙引號內進行波浪號擴展),因為它會將未加引號的變數擴展拆分為字元串中的空格字元(在$IFS;中的任何字元上)也將文件名通配應用於生成的單詞),而zshshell 不這樣做。

請注意,它僅適用於您的字元串bash中沒有其他空格、製表符或換行符,並且該字元串也不包含文件名萬用字元。例如,如果路徑名中有空格,或者如果您想bash列出名為*.

在兩個 shell 的變數中儲存單獨的命令行參數的正確方法是使用數組:

args=( -la ~/Downloads )

或者

args=( -l -A ~/Library/'Application Support' )

bash外殼中,您將使用它作為

ls "${args[@]}"

在這裡,"${args[@]}"展開為由數組元素組成的列表args,每個元素都單獨引用。

zshshell 中,你可以做同樣的事情或者只是使用

ls $args

在這裡,zshshell 會將數組擴展args為單獨的元素,每個元素都變成 的參數ls,但它不會(預設情況下)拆分這些元素或對它們應用文件名萬用字元。

這些範例還保留波浪號不加引號,允許 shell 將其擴展為使用者主目錄的路徑名。這種擴展會在分配給args數組時發生,而不是在使用值時發生。

有關的:

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