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


75

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

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

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

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


我对示例代码进行了一些更改。在bash中,cd sholud在别名或功能中执行。
qrtt1

Answers:


89

您需要将文件来源为:

. myfile.sh

要么

source myfile.sh

如果不进行采购,更改将在子外壳而不是在调用脚本的父外壳中发生。但是,当您获取文件源时,将执行文件中的行,就像在命令行中键入它们一样。


17

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

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

16

采购要运行的脚本是一种解决方案,但应注意,此脚本可以直接修改当前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目录书签。


我能够像在源my_script.sh中那样将参数传递给源脚本myarg myarg将其作为$ 1放入脚本中
dolphus333 19/12/21

4

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

test.sh

cd development/
ls
# Do whatever you want.

执行test.sh

source test.sh

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

. test.sh

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


1

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

解决这个问题的方法是使用

source yourscript.sh

这样做的来源是将脚本作为TCL脚本执行,即,其效果与在登录shell的命令行中键入每一行并从那里执行时的效果相同。这样,当脚本在cd之后完成时,它将保留在该目录中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.