Command-Line

如何在 zsh 的變數中呼叫帶有空格的腳本?

  • February 9, 2022

這在 bash 中按預期工作:

> t="ls -l"
> $t #== ls -l
> "$t" #== "ls -l"
ls -l: command not found

但是在 zsh 我得到了這個:

> t="ls -l"
> $t #== "ls -l"
ls -l: command not found

如何強制 shell 像 bash 一樣再次解析變數值?

如果您想要一個擴展為多個參數的變數,請使用數組:

var=(ls -l)
$var

但是要儲存程式碼,最明顯的儲存類型是函式:

myfunction() ls -l

或者:

myfunction() ls -l "$@"

讓該函式接受額外的參數傳遞給ls.

bash像大多數其他類似 Bourne 的 shell 在擴展時拆分未引用變數的事實是 IMO 的一個錯誤。看看它會導致什麼樣的問題。但是,如果您想要這種行為,您可以設置該shwordsplit選項。您還可以添加globsubst選項來恢復在其他類似 Bourne 的 shell 中發現的另一個錯誤bash,其中變數擴展也受制於萬用字元(又名路徑名擴展)。emulate sh或者用or做完整的 shebang emulate ksh(但失去了更多的 zsh 功能)。

不必去那裡,您也可以告訴zsh顯式拆分變數:

var='ls -l'
$=var # split on $IFS like the $var of bash/sh
${(s[ ])var} # split on spaces only regardless of the value of $IFS
var='*.txt'
echo $~var # do pathname expansion like the $var of bash/sh
var='ls -ld -- *.txt'
$=~var # do both word splitting and filename generation

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