例如,假设我有一个名为tmp的目录,我在主目录
$pwd
/my/home/directory/
$ls
tmpdir
我有一个tmp.sh cds进入“tmp”目录
#!/bin/bash
cd tmp
我使用以下命令运行脚本:
$sh tmp.sh
运行此脚本后,我仍然在我的主目录中。
1)我想理解为什么这不能彻底运作(我只是粗略地知道它与子进程有关,这与父进程无关(这是否正确?)) 和
2)我怎样才能完成这项任务(最终进入脚本执行完脚本后编写的目录)?
答案 0 :(得分:4)
这是你的shell的工作目录。执行脚本时,会为脚本创建一个新shell。您正在更改其余代码的当前工作目录,而不是父shell。
2)我怎样才能完成这项任务(最终进入脚本执行完脚本后编写的目录)?
要完成此操作,您可以&&
编写脚本。因此,如果脚本成功执行,那么只有您以
./tmp.sh && cd <to_your_directory>
您还应该通过unix.se帖子 - Why cd is not a program?以便更好地理解。
答案 1 :(得分:2)
1)运行shell脚本时,它会在shell的新实例中运行。一旦这个shell终止,你仍然处于旧的原始版本的shell中。那是来自外部的shell脚本只是一些代码。
2)没有真正好的解决方案。我会做的
sh tmp.sh && cd /tmp
答案 2 :(得分:1)
简短的回答是脚本在单独的进程中运行,并且在一个进程中更改当前目录不会影响其他进程。例如,对于例如设置变量(参见here了解这可能导致的一些有趣的错误。)
要使其正常工作,您可以使用source tmp.sh
来源脚本来运行脚本,就像您在提示符下键入脚本一样。为了使它更方便,你可以在〜/ .bashrc中添加一个函数:
foo() {
cd somewhere
}
或带
的别名alias foo="cd somewhere"
当你运行foo
时(从下一次登录),两者都会允许你在某处cd。
答案 3 :(得分:0)
1)当前工作目录cwd是进程状态的一部分。当shell脚本启动时,它是一个新进程,因此它有自己的cwd。脚本shell中的任何命令只影响该进程的cwd。
2)如果你的脚本没有产生输出,你可以让你的脚本输出你想要的目录,并有一个shell函数/别名来调用脚本并更改输出位置。像
这样的东西cd `script`