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

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

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

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

是否可以通过脚本改变我的path?

您需要将该文件的源代码设置为:

 . myfile.sh 

要么

 source myfile.sh 

没有源代码,变化将发生在子shell中,而不是在调用脚本的父shell中。 但是,当你input一个文件时,文件中的行就像在命令行input一样。

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

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

在find要运行的脚本是一个解决scheme的时候,应该知道这个脚本可以直接修改当前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 )将创build子shell并在那里执行脚本。

test.sh

 cd development/ ls # Do whatever you want. 

通过执行test.sh

 source test.sh 

.source最短符号。 所以你也可以做

 . test.sh 

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

每当您在loginshell上运行脚本时,都会产生一个新的subprocess,脚本执行将在子shell中完成。脚本完成后,子shell将退出并返回到loginshell。因此,无论何时通过脚本,目录将被更改为由cd指定的path,但在脚本完成时,您将回到loginshell到您启动脚本的工作目录。

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

 source yourscript.sh 

它的源代码是以TCL脚本的forms执行脚本,也就是说,它与在loginshell的命令行上input每一行并从那里执行的效果相同。 所以当脚本在cd之后完成时,它就保持在那个目录中。