shell 脚本在文件解压缩之前继续

shell 脚本在文件解压缩之前继续

以下是我在 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 的跟踪输出,这也将显示脚本中操作的顺序。

相关内容