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