在脚本中更改目录不会改变目录——为什么?

在脚本中更改目录不会改变目录——为什么?

我见过这个答案自从搜索这个以来,但最初我写了这个脚本:

for i in `seq 1 $1`; 
   do cd ../;
done;

它不会改变目录。为什么会这样,运行为

./updir.sh 5

答案1

按照您显示的方式运行脚本会在子 shell 中创建一个复制的环境,并且您所做的任何更改(例如设置目录或环境变量)都只会影响这个子 shell 环境,而不会影响调用 shell。

为了从脚本更改当前 shell,您必须使用source.命令在当前 shell 中运行该脚本:

. ./updir.sh 5

您可以使用别名自动完成此操作:

alias updir='. ./updir.sh'

或者,您可以使用函数代替脚本:

updir()
{   for i in `seq 1 $1`; 
       do cd ../;
    done
}

答案2

因为脚本是在子 shell 中运行的,所以它单独跟踪当前工作目录。最简单的解决方案是使用一个函数:

function updir() {
  for i in $(seq 1 $1); do
    cd ..
  done
}

相关内容