我已经设置了一个环境变量,并想在调用命令时使用它,但没有骰子。
没有变量的完整命令可以工作:
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
将多个单独的字符串(参数)填充到单个字符串中几乎总是错误的方法,至少在您需要再次提取这些单独的字符串时是这样。
您所做的工作在bash
shell 中有效(假设您使用$HOME
代替~
,因为 shell 不会在双引号内进行波形符扩展),因为它将字符串中的空格字符(在$IFS
; 和中的任何字符上)拆分未加引号的变量扩展还将文件名通配应用于生成的单词),而 shellzsh
不会这样做。
请注意,它仅适用于bash
因为没有其他字符串中的空格、制表符或换行符,并且该字符串也不包含文件名通配符。你的方法绝对会不是bash
例如,如果路径名中包含空格,或者您想要列出名为 的目录的内容,则可以使用*
.
在两个 shell 中将单独的命令行参数存储在变量中的正确方法是使用数组:
args=( -la ~/Downloads )
或者
args=( -l -A ~/Library/'Application Support' )
在bash
shell 中,您可以将其用作
ls "${args[@]}"
此处,"${args[@]}"
展开为由数组元素组成的列表args
,每个元素都单独引用。
在zsh
shell 中,您可以执行相同的操作或仅使用
ls $args
在这里,zsh
shell 会将数组扩展args
为单独的元素,每个元素都变成 的参数ls
,但它不会(默认情况下)拆分这些元素或对它们应用文件名通配。
这些示例还保留波浪号不加引号,从而允许 shell 将其扩展为用户主目录的路径名。这种扩展会在分配给args
数组时发生,而不是在使用值时发生。
有关的: