【问题标题】:How to run 'cd' in shell script and stay there after script finishes?如何在 shell 脚本中运行“cd”并在脚本完成后留在那里?
【发布时间】:2010-10-07 07:13:44
【问题描述】:

我在我的 shell 脚本 (bash) 中使用了“更改目录”

#!/bin/bash
alias mycd='cd some_place'
mycd
pwd

pwd 正确打印some_place,但脚本完成后我当前的工作目录没有改变。

是否可以通过脚本更改我的路径?

【问题讨论】:

标签: bash shell cd pwd


【解决方案1】:

另一个实用的解决方案是通过打开另一个 shell 会话来结束您的脚本。 例如:

#!/bin/bash
cd some_place
bash

在我的情况下,这对于位于我的 ~/bin 中的脚本很有用,例如,从任何其他地方调用。输入source ~/bin/mygoodoldscript 而不是mygoo<TAB><ENTER> 只是有点痛苦。

缺点是额外的外壳会占用更多资源(不多)。

【讨论】:

    【解决方案2】:

    您需要将文件来源为:

    . myfile.sh
    

    source myfile.sh
    

    如果没有源代码,更改将发生在子 shell 中,而不是在调用脚本的父 shell 中。但是,当您获取文件时,文件中的行会像在命令行中键入一样执行。

    【讨论】:

      【解决方案3】:

      虽然获取要运行的脚本是一种解决方案,但您应该知道,该脚本可以直接修改当前 shell 的环境。也不能再传递参数了。

      另一种方法是将脚本实现为 bash 中的函数。

      function cdbm() {
          cd whereever_you_want_to_go
           echo arguments to the functions were $1, $2, ...
      }
      

      自动跳转使用了这种技术: http://github.com/joelthelion/autojump/wiki 为您提供学习shell目录书签。

      【讨论】:

      • 我能够将参数传递给源脚本,如 source my_script.sh myarg myarg 将其作为 $1 进入脚本
      【解决方案4】:

      每当您在登录 shell 上运行脚本时,都会产生一个新的子进程,并且脚本在子 shell 中执行。脚本完成后,子 shell 退出并返回到登录 shell。因此,无论何时执行cd 通过脚本,目录更改为 cd 指定的路径,但是当脚本完成时,您会回到登录 shell 到您启动脚本的工作目录。

      克服这个问题的方法是使用,

      source yourscript.sh
      

      source 的作用是将脚本作为 TCL 脚本执行,即它与您在登录 shell 的命令行中键入每一行并从那里执行时具有相同的效果。因此,当脚本在 cd 之后完成时,它会保留在该目录中。

      【讨论】:

        【解决方案5】:

        脚本在单独的子shell 中运行。该子shell 更改目录,而不是您运行它的shell。一个可能的解决方案是source 脚本而不是运行它:

        # Bash
        source yourscript.sh
        # or POSIX sh
        . yourscript.sh
        

        【讨论】:

          【解决方案6】:

          可以通过采购来实现。采购基本上是在同一个 shell 中执行脚本,而正常执行(sh test.sh./test.sh)将创建子 shell 并在那里执行脚本。

          test.sh

          cd development/
          ls
          # Do whatever you want.
          

          通过

          执行test.sh
          source test.sh
          

          .source 的最短符号。所以你也可以这样做

          . test.sh
          

          这将执行脚本并将当前shell的目录更改为development/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-26
            • 1970-01-01
            • 2013-01-22
            • 2020-05-18
            • 2012-04-13
            相关资源
            最近更新 更多