为什么cd似乎会影响ls上的通配符?

时间:2016-02-05 07:21:17

标签: bash quoting

以下脚本不起作用:

set -x

cd "${HOME}/${PROJECT}"                               
echo "create specified jars list"                                      
cat /dev/null > jar-versions                                    
for config in $(ls *.clj); do      
  echo $config                                                         
  <some pile of java>
done

它出错了以下内容:

+ cd /home/pat/
+ echo 'create specified jars list'
create specified jars list
+ cat /dev/null
++ ls '*.clj'
ls: cannot access *.clj: No such file or directory

错误似乎是for循环中的ls有一些时髦的引用。我不知道为什么会这样。以下代码按预期工作:

set -x

#cd "${HOME}/${PROJECT}"                               
echo "create specified jars list"                                      
cat /dev/null > jar-versions                                                                              
for config in $(ls *.clj); do
  echo $config                                                         
  <some pile of java>
done

唯一的区别是我已经注释掉了cd调用。我有一个解决方法,但我对于为什么cd的执行与通配符的引用相混淆而感到沮丧。

我正在使用ubuntu 14.02和bash GNU bash,版本4.3.11(1)-release

根据要求

编辑我已经解释了&#39; cat / dev / null&#39;来自(好赶上@ 123),下面是&#39; set -x&#39;的输出。工作脚本。

+ echo 'create specified jars list'
create specified jars list
+ cat /dev/null
++ ls config.clj tinyconfig.clj
+ for config in '$(ls *.clj)'
+ echo config.clj
config.clj
+ for config in '$(ls *.clj)'
+ echo tinyconfig.clj
tinyconfig.clj

1 个答案:

答案 0 :(得分:1)

无法注意到我的本地环境中未设置env var。设置env var时有效。