【发布时间】:2012-10-13 14:09:09
【问题描述】:
为什么反引号或 $(..) 中的 cd 命令永远不会更改到新目录。任何想法如何在单个命令中执行此操作,即捕获任何错误并更改目录。
[root@linux ~]# pwd
/root
[root@linux ~]# cmdMsg=`cd /tmp 2>&1`
[root@linux ~]# pwd
/root
【问题讨论】:
为什么反引号或 $(..) 中的 cd 命令永远不会更改到新目录。任何想法如何在单个命令中执行此操作,即捕获任何错误并更改目录。
[root@linux ~]# pwd
/root
[root@linux ~]# cmdMsg=`cd /tmp 2>&1`
[root@linux ~]# pwd
/root
【问题讨论】:
子进程不能改变其父进程的环境。
pwd
`cd /tmp 2>&1`
pwd
【讨论】:
如果您想在单个命令中运行所有命令,请使用 ; 分隔命令。
例如:
cd /; ls; cd ~; ls; cd /var; ls
但你的问题是 cd 在新生成的 shell 中运行,这不会影响你当前的 shell。
【讨论】:
因为它的 cd 在您打开以运行 cd 的新 shell 的上下文中,例如:
cmdMsg=`cd /tmp; pwd`
echo $cmdMsg
它会告诉你你在 /tmp
【讨论】:
因为反引号会产生一个单独的进程并单独运行。所以它会在该进程中执行 cd,但不会更改当前进程的工作目录。
如果您只需要查看命令是否成功并且想要更改目录,则可以检查它的退出代码:
cd /tmp
retval = $?
if [ $retval -gt 0 ]; then
echo "cd failed"
fi
【讨论】:
if ! cd /tmp; then echo "cd failed"; fi