【问题标题】:Why does cd in backticks never work [duplicate]为什么反引号中的 cd 从不工作[重复]
【发布时间】:2012-10-13 14:09:09
【问题描述】:

可能重复:
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

【问题讨论】:

    标签: linux bash shell unix sh


    【解决方案1】:

    子进程不能改变其父进程的环境。

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

    【讨论】:

      【解决方案2】:

      如果您想在单个命令中运行所有命令,请使用 ; 分隔命令。

      例如:

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

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

      【讨论】:

      • 这与反引号有什么关系?
      【解决方案3】:

      因为它的 cd 在您打开以运行 cd 的新 shell 的上下文中,例如:

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

      它会告诉你你在 /tmp

      【讨论】:

        【解决方案4】:

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

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

        cd /tmp
        retval = $?
        
        if [ $retval -gt 0 ]; then
            echo "cd failed"
        fi
        

        【讨论】:

        • 其实一步就能搞定,即if ! cd /tmp; then echo "cd failed"; fi
        • @doubleDown - 确实如此。我只是想详细一点,所以很清楚发生了什么。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        相关资源
        最近更新 更多