2

例如,假设我有一个名为 tmp 的目录,并且我在主目录中

$pwd
/my/home/directory/
$ls
tmpdir

我有一个 tmp.sh 进入“tmp”目录

#!/bin/bash
cd tmp

我使用以下命令运行脚本:

$sh tmp.sh

运行此脚本后,我仍在我的主目录中。

1)我想了解为什么这不能彻底工作(我只是大致知道它与独立于父进程的子进程有关(这是否正确?))和

2)我怎样才能完成这个任务(最终在脚本执行完成后脚本cd-ed的目录中)?

4

4 回答 4

4

那是你的 shell 的工作目录。当您执行脚本时,会为您的脚本创建一个新的 shell。您正在更改其余代码的当前工作目录,而不是父 shell。

2)我怎样才能完成这个任务(最终在脚本执行完成后脚本cd-ed的目录中)?

为此,您可以&&编写脚本。因此,如果脚本成功执行,那么只有您最终进入新目录

./tmp.sh && cd <to_your_directory>

您还应该阅读 unix.se 帖子 -为什么 cd 不是程序?为了更好地理解。

于 2013-02-14T17:43:18.297 回答
2

简短的回答是脚本在单独的进程中运行,并且在一个进程中更改当前目录不会影响其他进程。例如设置变量也是如此(有关这可能导致的一些有趣的错误,请参见此处)。

为了使它工作,您可以使用您的脚本source tmp.sh来运行脚本,就像您在提示符下键入它一样。为了更方便,您可以在 ~/.bashrc 中添加一个函数:

foo() { 
   cd somewhere
}

或别名

alias foo="cd somewhere"

然后,两者都将允许您在运行时foo(从下一次登录)到某个地方 cd。

于 2013-02-14T17:45:21.327 回答
2

1) 当你运行一个 shell 脚本时,它会在一个新的 shell 实例中运行。一旦这个 shell 终止,你仍然在 shell 的旧版本中。也就是说,从外部看,shell 脚本只是一段代码。

2)没有真正好的解决方案。我会做

sh tmp.sh && cd /tmp
于 2013-02-14T17:43:46.440 回答
0

1) 当前工作目录 cwd 是进程状态的一部分。当 shell 脚本启动时,它是一个新进程,因此它有自己的 cwd。脚本外壳中的任何命令只会影响该进程的 cwd。

2)如果您的脚本不会产生输出,您可以让您的脚本输出您想要的目录,并拥有一个调用脚本并更改输出位置的 shell 函数/别名。就像是

cd `script`
于 2013-02-14T17:46:22.117 回答