如何使用脚本进入目录?

时间:2013-02-14 17:39:03

标签: bash

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

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

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

#!/bin/bash
cd tmp

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

$sh tmp.sh

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

1)我想理解为什么这不能彻底运作(我只是粗略地知道它与子进程有关,这与父进程无关(这是否正确?)) 和

2)我怎样才能完成这项任务(最终进入脚本执行完脚本后编写的目录)?

4 个答案:

答案 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`