所有
因为我和bash一样反感,我以为我会试试zsh,这似乎很好说。所以,马上就碰到了这堵砖墙:
function z
{
var="ls -l"
"$var"
}
在执行'ls -l'的bash中,在zsh中它给出了“找不到命令:ls -l” 因为我对zsh完全是原始的,所以我不知道它和bash之间会有什么不同会导致上述情况。
答案 0 :(得分:4)
(我假设你的倒数第二行是$var
,而不是"$var"
。)
Zsh并不努力与传统的Bourne shell完全兼容。 sh和zsh之间的主要不兼容的变化是,不带引号的参数替换($var
)在sh(和ksh和bash)中经历了字段拆分和文件名生成(globbing),但在zsh中没有。在zsh中,$var
始终扩展为单个单词(除非var
是数组变量),此处为ls -l
,而在sh $var
中会扩展为两个单词{{ 1}}。
您可以通过编写ls l-
强制对zsh中的扩展结果进行字段拆分,并且可以通过编写$=var
($~var
或$~=var
扩展来强制生成文件名都)。这很少是必要的;通常,如果您需要扩展为多个单词,则可以在变量中存储多个单词。
另见What is word splitting? Why is it important in shell programming?
答案 1 :(得分:2)
这会给你在bash中找不到的命令,只是因为通过使用引号,你不允许插值(如Perl手册所称),或者重新拆分$ var的内容,可以这么说。因此,对于“$ var”,永远不会有多个参数,并且一个参数将是$ var的内容。