我只想写一个脚本改变我的目录。
我将以下命令放入文件中/home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
我做到了
chmod +x pathABC
在终端中,在 中/home/alex
,我运行了./pathABC
,但输出只是HelloWorld
,当前目录没有改变。
那么问题出在哪里呢?
答案1
正如其他人所解释的那样,目录是在脚本的子进程中更改的,而不是在调用脚本的终端进程中更改的。子进程终止后,您将回到原来的终端。
几种替代方案:
1. 符号链接
在你的主页上放置一个符号链接,指向你想要轻松访问的长路径
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
然后使用以下命令访问目录:
$ cd ~/pathABC
2. 别名
在你的 ~/.bashrc 中放置一个别名:
alias pathABC="cd /home/alex/Documents/A/B/C"
(从这里)
3. 功能
创建一个改变目录的函数,该函数在终端进程中运行,然后可以改变其目录。
(从这里)
4. 避免在儿童时期奔跑
获取脚本的来源,而不是运行它。获取来源(通过.
或完成source
)会导致脚本在同一个 shell 中执行,而不是在其自己的子 shell 中运行。
$ . ./pathABC
5. cd-able 变量
设置cdable_vars
您的选项~/.bashrc
并为目录创建环境变量:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
然后你可以使用cd pathABC
(从这里)
答案2
当您在终端中运行脚本时,会运行一个子进程。在这个子程序中,您的脚本将更改为指定的任何目录。但在父进程中,即您运行脚本的地方仍然在旧路径中。或者我们可以简单地说:
cd 命令的作用范围只是针对子进程而不是父进程。
答案3
你犯了一个思维错误。虽然目前壳保留在同一目录中,脚本已移至新目录。
您可以通过在新的目录,并在更改目录后从脚本运行它:
#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)
第二个脚本将从新目录运行。
HelloWorld
只是脚本的输出。
答案4
$SHELL
最后使用
bash 脚本在其当前环境或其子环境上运行,但从不在其父环境上运行。
然而,这个问题经常被问到,因为人们希望执行后留在某个目录中的命令提示符中来自另一个目录内的脚本。
如果是这样的话,只需执行子$SHELL
实例在脚本的最后:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
要返回上一个父 shell 实例,请使用Ctrl+ D。