两个脚本:一个改变目录,另一个不改变?

两个脚本:一个改变目录,另一个不改变?

我有两个脚本。一个是:

#!/bin/bash
if [ $1 = 1 ]; then 
   dir=mydir-1.6_
else
    dir=mydir
fi
cd ~/code/${dir}$2
echo $(pwd)

尽管有几篇帖子说脚本是在子 shell 中运行的,但它应该不会对正在执行的 shell 产生影响,但上述脚本仍然会改变目录。

现在我有另一个脚本:

#!/bin/bash
dir=/WORK/temp/$1
mkdir -p $dir
cd $dir
wget http://somurl.com/archive.zip
unzip archive.zip

上述脚本将文件解压到预期目录中,但将调用 shell 保留在同一目录中。在两个脚本中调用 cd 时有什么区别?

答案1

如果我理解了您的问题,您可以尝试从第一个脚本执行第二个脚本,并传入预期的目录。就像这样。

脚本 1

#!/bin/bash
TEST="1234"
echo "$TEST"
bash 2.sh "$TEST"

脚本2

#!/bin/bash
TEST="$1"
echo "$TEST"

答案2

你的第一个脚本没有改变目录。我不知道你为什么认为它会改变目录,但是cd执行脚本将绝不影响父级 shell。这就是它的工作原理。

唯一可以改变父 shell 目录的方法是,你通过 source 获取它,而不是执行它。我已将你的第一个脚本另存为,foo.sh并从我的 运行它$HOME

$ pwd
/home/terdon
$ foo.sh 1 
/home/terdon/code/mydir-1.6_
$ pwd
/home/terdon

如您所见,脚本内部的目录已更改,但父 shell 的 PWD 保持不变。现在,如果您执行 source 命令,它似乎按预期工作:

$ . ~/scripts/foo.sh
bash: [: =: unary operator expected
/home/terdon/code/mydir
$ pwd
/home/terdon/code/mydir

因此,如果您希望脚本更改其父 shell 的目录,则需要执行它而不是执行它。但是,如果您要这样做,您需要编写一个函数,而不是脚本:

changeDir(){
    targetDir="mydir"
    if [ "$1" = "1" ]; then
       targetDir="mydir-1.6_"
    fi
    \cd "$targetDir"
}

将上述内容添加到您的~/.bashrc并使用它而不是脚本。函数总是影响运行它们的 shell,因此它会按照您的需要更改您的目录。

请注意,我使用的是\cd而不是cd。这是因为如果您cd 是某事物的别名。另请注意,我稍微修改了您的脚本,以避免bash: [: =: unary operator expected您在使用原始方法时遇到的问题。在 shell 脚本中,基本的始终引用变量。在本例中,当$1为空时,脚本试图运行:

$ if [ = 1 ]; then  targetDir="mydir-1.6_"; fi
bash: [: =: unary operator expected

当然,这会导致错误,因为没有东西可以比较。通过引用,$1您可以比较空字符串,这将按预期工作。

相关内容