$ 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>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;
- 因此会产生错误。