为什么“cd”在 shell 脚本中不起作用?

Moh*_*ani 61 command-line bash scripts cd-command

我只想写一个脚本来改变我的目录

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

#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Run Code Online (Sandbox Code Playgroud)

我做了

chmod +x pathABC
Run Code Online (Sandbox Code Playgroud)

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

那么有什么问题呢?

Gau*_*ier 97

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

几种选择:

1. 符号链接

在您的家中放置一个符号链接到您想要轻松访问的长路径

$ ln -s /home/alex/Documents/A/B/C ~/pathABC
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令访问目录:

$ cd ~/pathABC
Run Code Online (Sandbox Code Playgroud)

2. 别名

在你的 ~/.bashrc 中添加一个别名:

alias pathABC="cd /home/alex/Documents/A/B/C"
Run Code Online (Sandbox Code Playgroud)

(从这里

3. 功能

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

(从这里

4.避免小时候跑步

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

$ . ./pathABC
Run Code Online (Sandbox Code Playgroud)

(从这里这里

5. 支持 cd 的变量

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

shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
Run Code Online (Sandbox Code Playgroud)

然后你可以使用 cd pathABC

(从这里

  • 现在我明白`source`的用法了!我一直想知道为什么我做 `source .bashrc` 而不是 `bash .bashrc` (16认同)
  • > 5. cd-able vars -- 不是 `cd $pathABC` 吗? (2认同)

小智 10

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

cd 命令的范围仅适用于子进程而不是父进程。

  • 除此之外,@alex 为实现您正在寻找的效果,通过获取它来执行脚本 _within_ 父进程:要么`. pathABC` 或`源路径ABC`。 (2认同)

Jac*_*ijm 6

你犯了一个思维错误。当当前shell保持在同一目录中时,脚本已移动到新目录。

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

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

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

HelloWorld 
Run Code Online (Sandbox Code Playgroud)

只是脚本的输出。

  • HelloWorld 不会“返回”到父 shell,而是输出到标准输出 (3认同)

Elv*_*man 6

实际上,经过多次搜索,我刚刚发现,如果您需要更改目录,并且仍然保留相同的 shell,这样您将在当前脚本中获得所有答案,您可以使用:

(cd your_dir; do_some_command_there)
Run Code Online (Sandbox Code Playgroud)

例如,我需要使用的是:

(cd your_dir; git remote -v | wc -l)
Run Code Online (Sandbox Code Playgroud)

奇迹般有效!