为什么CD中的反引号永远不会起作用

时间:2012-10-23 15:25:26

标签: linux bash shell unix sh

  

可能重复:
  Why doesn’t “cd” work in a bash shell script?

为什么反引号或$(..)中的cd命令永远不会更改为新目录。知道如何在单个命令中执行此操作,即捕获任何错误并更改目录。

[root@linux ~]# pwd
/root
[root@linux ~]# cmdMsg=`cd /tmp 2>&1`
[root@linux ~]# pwd
/root

4 个答案:

答案 0 :(得分:3)

因为反引号会产生一个单独的进程并单独运行。因此它在该过程中执行cd但不会更改当前进程的工作目录。

如果您只需要查看命令是否成功并且您想要更改目录,则可以检查它的退出代码:

cd /tmp
retval = $?

if [ $retval -gt 0 ]; then
    echo "cd failed"
fi

答案 1 :(得分:0)

因为它是你打开来运行你的cd的新shell的上下文中的cd,试试例如:

cmdMsg=`cd /tmp; pwd`
echo $cmdMsg

它会告诉你你在/ tmp

答案 2 :(得分:0)

如果要在一个命令中全部运行命令,请将命令与;分开。

例如:

cd /; ls; cd ~; ls; cd /var; ls

但是你的问题是cd在新生成的shell中运行,这不会影响你当前的shell。

答案 3 :(得分:0)

子进程无法更改其父进程的环境。

pwd
`cd /tmp 2>&1`
pwd
  1. 在当前流程中打印工作目录。
  2. 创建一个新的子流程。
  3. 更改子进程内的目录/ tmp(将stderr重定向到stdout)。
  4. 退出子流程。
  5. 在当前流程中打印工作目录。