如何在shell脚本中运行'cd'并在脚本完成后留在那里?

时间:2010-10-07 07:13:44

标签: bash shell cd pwd

我在shell脚本(bash)中使用了'change directory'

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

pwd正确打印some_place,但在脚本完成后,我当前的工作目录不会更改。

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

6 个答案:

答案 0 :(得分:77)

您需要将文件源为:

. myfile.sh

source myfile.sh

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

答案 1 :(得分:14)

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

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

答案 2 :(得分:13)

在寻找您想要运行的脚本是一种解决方案时,您应该知道此脚本可以直接修改当前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目录书签。

答案 3 :(得分:3)

可以通过采购来实现。 Sourcing基本上是在同一个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/

答案 4 :(得分:1)

每当你在登录shell上运行一个脚本时,就会生成一个新的子进程,并在子shell中执行脚本。一旦脚本完成,子shell退出,你就会返回到登录shell .Hence每当你做一个cd通过一个脚本,目录被更改为cd指定的路径,但是当脚本完成时,你会回到你的登录shell到你启动脚本的工作目录。

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

source yourscript.sh

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

答案 5 :(得分:0)

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

#!/bin/bash
cd some_place
bash

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

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