为什么执行 bash 文件后我总是回到主目录?

为什么执行 bash 文件后我总是回到主目录?

在我的 bash 文件中,我要求导航到某个子目录,解压一个文件并留在那里,但是当我输入 pwd 时,我可以看到我总是回到主目录。为什么?

有什么方法可以让 shell 粘在子目录吗?

答案1

当您运行脚本时,它会为其打开一个新的子 shell,因此不会更改您所在 shell 的环境变量(包括您的工作目录:$PWD)。如果您希望脚本在与您相同的 shell 中运行,从而保留它对环境变量所做的更改,请将其作为 source 而不是执行。像这样:

source my-script

或者:

. my-script

但是,这会遗留脚本使用的每个临时变量。如果要避免这种情况,请在脚本中创建一个函数,并将所有临时变量声明为本地变量。如下所示:

function main()
{
    local var1=whatever
    cd /path/to
    do-something
    ...
}

main

当使用 调用时source,它将留下所有变量更改,例如工作目录,但不会留下临时变量。

答案2

执行脚本时,它会在单独的进程中运行。脚本退出时,对工作目录、环境变量等的更改都会丢失。

要在当前 bash 进程中执行脚本,您需要 source 该脚本

. myscript.sh

答案3

是的,您可以创建一个函数来执行此操作。首先,创建一个脚本来完成所有繁重的工作。

然后在 .bashrc 中创建一个函数,如下所示:

xcd () {
    local archive="$1" dir="$2"

    your_script "$archive"
    cd "$dir"
}

与整个脚本不同,函数是在当前 shell 的上下文中执行的。

请参阅 BASH FAQ 了解解释

答案4

您的 bash 脚本会继承调用 shell 的环境(工作目录、shell 变量等)的副本,该副本在脚本退出时会被丢弃。如果您测试任何 shell 变量(例如,通过键入“echo $foo”),它们将保留运行脚本之前的值(或不存在),就像 pwd 一样。

相关内容