以下是我在 Mac 上编写的脚本(使用 bourne shell“sh”)。这是一个较大脚本的一部分。
目标:我有一个 zip 文件,我提前知道压缩文件的名称。所以我想将 zip 文件解压缩到 /tmp/sampleFolder 中。然后我希望能够检查该文件夹以确保我期望的文件名位于其中。
例如,如果 zip 中的文件之一是 john.txt,我想检查一下
/tmp/sampleFolder/john.txt
存在。
问题:奇怪的是,我对文件是否存在的检查似乎是在解压缩完成之前进行的。我可以通过在脚本顶部添加 set -e 来解决此问题。然后脚本中的所有命令似乎都是按顺序执行的。但我不明白为什么这可以解决它。
我将不胜感激:
a.) 替代解决方案/解释为什么在文件解压缩之前检查文件是否存在
b.) 或解释为什么 set -e 强制脚本按顺序执行。我对 set -e 的研究只是说,如果命令返回 0 以外的值,则脚本将被迫退出。但是,脚本不是仅仅退出,而是按顺序运行。所以看来还有更多的事情要做。谢谢你!
#!/bin/sh
rm -rf "/tmp/sampleFolder"
unzip ~/Desktop/myFile.zip -d "/tmp/sampleFolder"
if [ ! -r /tmp/sampleFolder/john.txt ]; then
echo "file not present!"
fi
答案1
我认为发布的脚本中的语句无法非顺序执行。
以下是我在 Mac 上编写的脚本(使用 bourne shell“sh”)。这是一个较大脚本的一部分。
如果确实存在问题,则很可能出现在较大的脚本中,这就是为什么它没有出现在简化示例中。
答案2
Shell 脚本始终按顺序运行。 Set -e 对操作顺序没有影响,仅在非零时退出。
“按顺序”的例外是当您使用 进行后台任务时&
,此处似乎不存在。
我怀疑你的解压缩行为并不像你期望的那样。首先尝试echo $?
在下一行回显 unzip 的返回代码,看看是否成功。之后添加 als -l /tmp/sampleFolder
以查看内容。
您还可以运行set -x
以查看 bash 的跟踪输出,这也将显示脚本中操作的顺序。