给zsh一个尝试 - 第一个谜:

时间:2011-12-19 20:59:26

标签: zsh

所有

因为我和bash一样反感,我以为我会试试zsh,这似乎很好说。所以,马上就碰到了这堵砖墙:

function z
{
   var="ls -l"
   "$var"
}

在执行'ls -l'的bash中,在zsh中它给出了“找不到命令:ls -l” 因为我对zsh完全是原始的,所以我不知道它和bash之间会有什么不同会导致上述情况。

2 个答案:

答案 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的内容。