为什么命令中的变量扩展在 ZSH 中不起作用,但在 BASH 中却起作用?

为什么命令中的变量扩展在 ZSH 中不起作用,但在 BASH 中却起作用?

我已经设置了一个环境变量,并想在调用命令时使用它,但没有骰子。

没有变量的完整命令可以工作:

nacho@WouldntYouLikeToKnow ~ % ls -la ~/Downloads             
total 8675309
drwx------+ 16 nacho  staff        512 Sep 28 10:30 .
drwxr-x---+ 29 nacho  staff        928 Sep 29 10:39 ..

现在我设置一个变量并尝试使用它,但失败了:

nacho@WouldntYouLikeToKnow ~ % export testing="-la ~/Downloads"

nacho@WouldntYouLikeToKnow ~ % ls $testing
ls: invalid option --  
usage: ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when] [-D format] [file ...]

答案1

将多个单独的字符串(参数)填充到单个字符串中几乎总是错误的方法,至少在您需要再次提取这些单独的字符串时是这样。

您所做的工作在bashshell 中有效(假设您使用$HOME代替~,因为 shell 不会在双引号内进行波形符扩展),因为它将字符串中的空格字符(在$IFS; 和中的任何字符上)拆分未加引号的变量扩展还将文件名通配应用于生成的单词),而 shellzsh不会这样做。

请注意,它仅适用于bash因为没有其他字符串中的空格、制表符或换行符,并且该字符串也不包含文件名通配符。你的方法绝对会不是bash例如,如果路径名中包含空格,或者您想要列出名为 的目录的内容,则可以使用*.

在两个 shell 中将单独的命令行参数存储在变量中的正确方法是使用数组:

args=( -la ~/Downloads )

或者

args=( -l -A ~/Library/'Application Support' )

bashshell 中,您可以将其用作

ls "${args[@]}"

此处,"${args[@]}"展开为由数组元素组成的列表args,每个元素都单独引用。

zshshell 中,您可以执行相同的操作或仅使用

ls $args

在这里,zshshell 会将数组扩展args为单独的元素,每个元素都变成 的参数ls,但它不会(默认情况下)拆分这些元素或对它们应用文件名通配。

这些示例还保留波浪号不加引号,从而允许 shell 将其扩展为用户主目录的路径名。这种扩展会在分配给args数组时发生,而不是在使用值时发生。

有关的:

相关内容