81

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

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

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

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

4

6 回答 6

90

您需要将文件来源为:

. myfile.sh

或者

source myfile.sh

如果不采购,更改将发生在子 shell 中,而不是在调用脚本的父 shell 中。但是,当您获取文件时,文件中的行将被执行,就好像它们是在命令行中键入的一样。

于 2010-10-07T07:17:50.683 回答
17

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

# Bash
source yourscript.sh
# or POSIX sh
. yourscript.sh
于 2010-10-07T07:17:13.943 回答
17

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

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

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

此技术被 autojump 使用:http://github.com/joelthelion/autojump/wiki 您提供学习 shell 目录书签。

于 2010-10-07T08:50:43.427 回答
4

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

测试.sh

cd development/
ls
# Do whatever you want.

执行test.sh

source test.sh

.是 的最短记号source。所以你也可以通过

. test.sh

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

于 2014-04-15T18:43:04.670 回答
2

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

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

source yourscript.sh

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

于 2011-11-16T12:35:22.973 回答
1

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

#!/bin/bash
cd some_place
bash

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

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

于 2021-06-02T10:44:13.920 回答