我在shell脚本(bash)中使用了'change directory'
#!/bin/bash
alias mycd='cd some_place'
mycd
pwd
pwd
正确打印some_place
,但在脚本完成后,我当前的工作目录不会更改。
是否可以通过脚本更改路径?
答案 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会占用更多资源(不多)。