Command-Line
如何在 zsh 的變數中呼叫帶有空格的腳本?
這在 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做完整的 shebangemulate 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