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

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

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

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

有帮助吗?

解决方案

您需要将文件源为:

. myfile.sh

或者

source myfile.sh

不用采购,更改将发生在子壳中,而不是在调用脚本的父壳中发生。但是,当您采购文件时,文件中的行被执行,就像在命令行中键入一样。

其他提示

该脚本在单独的子壳中运行。该子壳会更改目录,而不是您运行的外壳。一个可能的解决方案是 source 脚本而不是运行它:

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

在采购要运行的脚本是一个解决方案时,您应该意识到此脚本可以直接修改当前外壳的环境。另外,不可能再通过参数了。

另一种方法是将您的脚本作为bash中的函数实现。

function cdbm() {
    cd whereever_you_want_to_go
     echo arguments to the functions were $1, $2, ...
}

此技术由AutoJump使用:http://github.com/joelthelion/autojump/wiki为您提供学习壳目录书签。

可以通过采购来实现。采购基本上是在同一外壳中执行脚本,而正常执行(sh test.sh 或者 ./test.sh)将创建子外壳并在那里执行脚本。

test.sh

cd development/
ls
# Do whatever you want.

执行 test.sh 经过

source test.sh

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

. test.sh

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

每当您在登录外壳上运行脚本时,都会产生一个新的子过程,并且脚本执行在子壳中完成。脚本完成后,子壳退出,您将返回登录外壳。因此,每当您通过CD进行CD脚本,该目录已更改为CD指定的路径,但是到脚本完成时,您可以从启动脚本的位置回到登录壳到工作目录。

克服这种方法的方法是使用,

source yourscript.sh

来源的作用是将脚本执行为TCL脚本,即它的效果与您在登录Shell的命令行上键入每条线并从那里执行时的效果相同。因此,当脚本在CD之后完成时,它将停留在该目录中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top