如何在shell脚本中运行'cd'命令并在脚本完成后保留当前目录?

91

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

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

pwd可以正确打印出some_place,但在脚本完成后我的当前工作目录没有改变。

是否可能通过脚本更改我的路径?


我在示例代码中进行了一些更改。在bash中,cd 应该在别名或函数中执行。 - qrtt1
7个回答

98

你需要这样引用该文件:

. myfile.sh
或者
source myfile.sh

如果没有使用source,更改将在子shell中发生而不是调用脚本的父shell中。但是当你source一个文件时,文件中的行将被执行,就好像它们在命令行上输入一样。


21

虽然从源代码中获取要运行的脚本是一种解决方法,但您应该知道,这样脚本可以直接修改当前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目录书签。


我能够像这样将参数传递给一个被调用的脚本: source my_script.sh myarg myarg 作为 $1 进入了脚本。 - dolphus333

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

4

这可以通过源代码实现。源代码基本上是在同一个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/

2
无论何时在登录 shell 上运行脚本,都会产生一个新的子进程,并且脚本执行是在子 shell 中完成的。一旦脚本完成,子 shell 退出,您将返回到登录 shell。因此,每当您通过脚本进行 cd 操作时,目录会更改为 cd 指定的路径,但是当脚本完成时,您会回到登录 shell 并回到开始运行脚本的工作目录。
要克服这个问题,可以使用:
source yourscript.sh

所谓的源代码执行,就是将代码作为TCL脚本进行执行,即与在登录shell的命令行中逐行输入并从那里执行时产生的效果相同。因此,在执行cd之后,该脚本保持在相应的目录中。


2
另一个实用的解决方案是通过打开另一个 shell 会话来结束脚本。例如:
#!/bin/bash
cd some_place
bash

这对我来说非常有用,比如我将脚本放在~/bin中,在任何其他地方都可以调用。但是,输入source ~/bin/mygoodoldscript而不是mygoo<TAB><ENTER>略微繁琐一些。缺点是额外的shell会占用一些资源(影响不大)。

0

虽然有答案,但我认为问题的意图是使用脚本导航到特定路径。

这里有一个简单实用的解决方案,可以在不取消现有终端环境标志的情况下工作。

  1. 提供一个bash/tch/sh脚本来生成路径
/* .goto.sh */
#!/usr/bin/env bash
echo '~/workspace'

2. 为脚本输出添加别名
alias goto 'cd `.goto.sh`'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接