在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%的确定,但这对我来说很有意义。

07-24 12:49