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