在bash脚本中执行以下两行代码时,“ls”抱怨文件不存在:
dirs=/content/{dev01,dev02}
ls -l $dirs
当我使用-x选项运行脚本时,它似乎是在单引号内传递变量(这将防止出现乱码):
+ dirs=/content/{dev01,dev01}
+ ls -l '/content/{dev01,dev01}'
ls: /content/{dev01,dev01}: No such file or directory
如果我从交互式 shell 程序(用引号引起来)执行“ls”命令,它将返回两个目录。
我一直在阅读《 Bash引用手册》(v 3.2),看不到文件名不匹配的任何原因(我没有将-f传递给shell),也没有任何可以设置以确保发生球。
最佳答案
我认为这是扩展的顺序:
因此,如果您的变量被替换,大括号扩展将不再发生。这对我有用:
eval ls $dirs
评估时要非常小心。它将逐字执行内容。因此,如果dirs包含
f{m,k}t*; some_command
,则ls完成后将执行some_command。它将在当前shell中执行您提供给eval
的字符串。不管它们是否存在,它将/content/dev01 /content/dev02
传递给ls。在内容后面加上*
可以使其成为路径名扩展,并且它将忽略不存在的路径:dirs=/content/{dev01,dev02}*
我对此不是100%的确定,但这对我来说很有意义。