【发布时间】:2010-10-07 07:13:44
【问题描述】:
我在我的 shell 脚本 (bash) 中使用了“更改目录”
#!/bin/bash
alias mycd='cd some_place'
mycd
pwd
pwd 正确打印some_place,但脚本完成后我当前的工作目录没有改变。
是否可以通过脚本更改我的路径?
【问题讨论】:
-
我对示例代码进行了一些更改。在 bash 中,cd 应该在别名或函数中执行。
我在我的 shell 脚本 (bash) 中使用了“更改目录”
#!/bin/bash
alias mycd='cd some_place'
mycd
pwd
pwd 正确打印some_place,但脚本完成后我当前的工作目录没有改变。
是否可以通过脚本更改我的路径?
【问题讨论】:
另一个实用的解决方案是通过打开另一个 shell 会话来结束您的脚本。 例如:
#!/bin/bash
cd some_place
bash
在我的情况下,这对于位于我的 ~/bin 中的脚本很有用,例如,从任何其他地方调用。输入source ~/bin/mygoodoldscript 而不是mygoo<TAB><ENTER> 只是有点痛苦。
缺点是额外的外壳会占用更多资源(不多)。
【讨论】:
您需要将文件来源为:
. myfile.sh
或
source myfile.sh
如果没有源代码,更改将发生在子 shell 中,而不是在调用脚本的父 shell 中。但是,当您获取文件时,文件中的行会像在命令行中键入一样执行。
【讨论】:
虽然获取要运行的脚本是一种解决方案,但您应该知道,该脚本可以直接修改当前 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目录书签。
【讨论】:
每当您在登录 shell 上运行脚本时,都会产生一个新的子进程,并且脚本在子 shell 中执行。脚本完成后,子 shell 退出并返回到登录 shell。因此,无论何时执行cd 通过脚本,目录更改为 cd 指定的路径,但是当脚本完成时,您会回到登录 shell 到您启动脚本的工作目录。
克服这个问题的方法是使用,
source yourscript.sh
source 的作用是将脚本作为 TCL 脚本执行,即它与您在登录 shell 的命令行中键入每一行并从那里执行时具有相同的效果。因此,当脚本在 cd 之后完成时,它会保留在该目录中。
【讨论】:
脚本在单独的子shell 中运行。该子shell 更改目录,而不是您运行它的shell。一个可能的解决方案是source 脚本而不是运行它:
# Bash
source yourscript.sh
# or POSIX sh
. yourscript.sh
【讨论】:
可以通过采购来实现。采购基本上是在同一个 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/。
【讨论】: