当前位置: 首页>>技术教程>>正文


为什么“cd”不能在shell脚本中工作?

, , ,

问题描述

我只想写一个更改我的目录的脚本。

我将以下命令放在文件/home/alex/pathABC

#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld

我做了chmod +x pathABC

在终端中,在/home/alex中,我运行./pathABC,但输出只是HelloWorld,并且当前目录不会更改。

那有什么不对?

最佳解决思路

正如其他人所解释的那样,目录在脚本的子进程中更改,而不是在调用脚本的终端进程中更改。在子进程终止后,您将返回到终端所在的位置。

几种选择:

1.符号链接

将符号链接放在您想要轻松访问的长路径中

$ ln -s /home/alex/Documents/A/B/C ~/pathABC

然后访问目录:

$ cd ~/pathABC

别名

在〜/.bashrc中添加一个别名:

alias pathABC="cd /home/alex/Documents/A/B/C"

(来自here)

3.功能

创建一个更改目录的函数,该函数在终端的进程中运行,然后可以更改其目录。

(来自here)

4.避免像孩子一样跑步

获取脚本而不是运行它。 Sourcing(由。或源完成)会导致脚本在同一个shell中执行,而不是在自己的子shell中运行。

$ . ./pathABC

(来自herehere)

5. cd-able变种

~/.bashrc中设置cdable_vars选项,并为目录创建一个环境变量:

shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"

然后你可以使用cd pathABC

(来自here)

次佳解决思路

在终端中运行脚本时,将运行子进程。在这个子程序中,即您的脚本将更改为指定的任何目录。但是在父进程中,即运行脚本的位置仍处于旧路径中。或者我们可以说:

The scope of cd command is only for child process not parent

第三种解决思路

你在思考错误。当前shell保留在同一目录中时,脚本已移至新目录。

您可以通过在新目录中创建另一个脚本并在更改目录后从脚本运行它来看到:

#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)

第二个脚本将从新目录运行。

HelloWorld 

只是脚本的输出。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2172.html,未经允许,请勿转载。