我有两个脚本。一个是:
#!/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
您可以比较空字符串,这将按预期工作。