这在 bash 中按预期工作:
> t="ls -l"
> $t #== ls -l
> "$t" #== "ls -l"
ls -l: command not found
Run Code Online (Sandbox Code Playgroud)
但是在 zsh 中我得到了这个:
> t="ls -l"
> $t #== "ls -l"
ls -l: command not found
Run Code Online (Sandbox Code Playgroud)
如何强制 shell 像 bash 一样再次解析变量值?
如果您想要一个扩展为多个参数的变量,请使用数组:
var=(ls -l)
$var
Run Code Online (Sandbox Code Playgroud)
但是要存储代码,最明显的存储类型是函数:
myfunction() ls -l
Run Code Online (Sandbox Code Playgroud)
或者:
myfunction() ls -l "$@"
Run Code Online (Sandbox Code Playgroud)
为该函数将额外的参数传递给ls.
bash与大多数其他类似 Bourne 的 shell 一样,在扩展时拆分未加引号的变量这一事实是 IMO 的一个错误。看看它会导致什么样的问题。但是如果你想要这种行为,你可以设置shwordsplit选项。您还可以添加globsubst选项来恢复在其他类似 Bourne 的 shell 中发现的另一个错误,bash其中变量扩展也受到通配(又名路径名扩展)的影响。或做充分的家当有emulate sh或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
Run Code Online (Sandbox Code Playgroud)
var='*.txt'
echo $~var # do pathname expansion like the $var of bash/sh
Run Code Online (Sandbox Code Playgroud)
var='ls -l *.txt'
$=~var # do both word splitting and filename generation
Run Code Online (Sandbox Code Playgroud)