如果在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 }