$ touch /tmp/abcd
$ ls -l /tmp/abcd
--w--w--w- 1 dinesh users 0 Oct 16 23:49 /tmp/abcd
$ x="cd /tmp && rm -rf abcd"
$ $x
$ pwd
/tmp
$ ls -l /tmp/abcd
--w--w--w- 1 dinesh users 0 Oct 16 23:49 /tmp/abcd
OTOH使用x="cd /tmp; rm -rf abcd"
按预期工作。那么,我的其他方法有什么问题,因为我想确定我在那个目录中? $?
始终返回0.
我想总是一个学习的机会。非常感谢。迪内希
$ uname -a
Linux test-host 3.0.93-0.5-default #1 SMP Tue Aug 27 08:17:02 UTC 2013 (925d406) x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:0)
如果我们打开跟踪输出(0>
是提示),我们就会明白。
0>set -x
0>$x
+ cd /tmp '&&' rm -rf abcd
我们看到&& rm -rf abcd
只是作为cd
命令的额外参数传递。显然,&&
作为命令列表运算符的解析仅在参数扩展之前进行,而在$x
被替换之后不再进行。奇怪的是,cd
并没有抱怨额外的争论 - 试试:
cd . dumb and dumber
逻辑上
eval $x
按需运作。
OTOH使用
x="cd /tmp; rm -rf abcd"
按预期工作。
你必须在这里弄错。
0>$x
+ cd '/tmp;' rm -rf abcd
bash: cd: /tmp;: No such file or directory
就像&&
一样,;
在这里不被解析为控制操作符,而只是作为目录名/tmp;
的最后一个字符 - 因此产生错误。