如果在bash脚本中使用`cd`不工作

在bash脚本中使用它时,我不能再使用cd

 [~/Downloads] # cat cd-backward #!/bin/bash cd .. [~/Downloads] # ./cd-backward [~/Downloads] # 

我应该转到~最后一行。

cd奇怪地在终端上工作得很好。 当我运行bash -c 'cd Download时,没有任何事情发生。

每个脚本都在自己的subshell执行,这是一个单独的进程,无法修改其父工作目录。 使用写入文件的脚本更改工作目录的唯一方法是使用它来获取它.source (它们是等价的)像这样:

 $ . cd-backward 

要么

 $ source cd-backward 

请注意,在这种情况下,您甚至不需要在脚本顶部使用shebang#!/bin/bash )。

当您启动脚本时,它会在自己的shell中运行,正如Arkadiusz已经提到的那样。 在这种情况下,您有bash实例。 如果修改脚本,则可以看到它:

 #!/bin/bash cd .. pwd 

在我的系统上运行的示例给出:

 bash-4.3$ pwd /home/xieerqi/Downloads bash-4.3$ ./cd-backward /home/xieerqi bash-4.3$ pwd /home/xieerqi/Downloads 

恰当地说,在脚本子shell中,您可以导航到主目录。 但是,父shell的当前工作目录保持不变

您的进程(称为$$ )有一个“当前目录”, ~/Downloads

当你./cd-backward ,那个Bash脚本在它自己的进程中运行,该进程有自己的“当前目录”,以~/Downloads开头。

cd ..影响./cd-backward进程的“当前目录”,将其更改为~ ,但不影响原始进程的“当前目录”。

./cd-backward结束,它的进程退出,而cd ..被遗忘了。

以下两种方式影响我自己的“当前目录”,保存在我的’〜/ .bashrc`中:

首先,一些alias

 alias ..='cd ..' alias ...='cd .. ; cd ..' 

这是我如何将当前目录保存在我的Window标题中(通过拦截cd ):

 # from the "xttitle(1)" man page - put info in window title update_title() { [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]] && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD" } cd() { [[ -z "$*" ]] && builtin cd $HOME [[ -n "$*" ]] && builtin cd "$*" update_title }