これは私のMacで書いたスクリプトです(bourneシェル「sh」を使用)。これは大きなスクリプトの一部です。
目的:zipファイルがあり、zipファイル名を事前に知っています。だから私はzipファイルを/tmp/sampleFolderに抽出したいと思います。それからそのフォルダをチェックして、私が期待するファイル名がフォルダにあることを確認したいと思います。
たとえば、zipのファイルの1つがjohn.txtの場合は確認したいと思います。
/tmp/sampleFolder/john.txt
存在する。
問題:奇妙なことに、解凍が完了する前にファイルが存在するかどうかを確認するようです。スクリプトの上に set -e を追加することでこの問題を解決できました。これにより、スクリプト内のすべてのコマンドが順番に実行されるようです。しかし、これがなぜ問題を解決するのか理解していません。
私はとても感謝します:
a.)解凍前にファイルが存在することを確認する代替ソリューション/説明
b.) または set -e がスクリプトを順次実行するように強制する理由を説明します。 set -eに関する私の研究によると、コマンドがゼロ以外の値を返すと、スクリプトは強制的に終了します。しかし、単に終了するのではなく、スクリプトが順次実行されます。それで、やるべきことが増えたようです。ありがとうございます!
#!/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シェル「sh」を使用)。これは大きなスクリプトの一部です。
実際に問題がある場合は、大きなスクリプトに問題がある可能性が高いため、単純化された例には表示されません。
答え2
シェルスクリプトは常に順次実行されます。 Set -e はジョブの順序に影響を与えず、ゼロ以外の場合にのみ終了します。
「順番に」の例外は、&
ここに存在しないようなバックグラウンドタスクを実行するために使用されるときです。
減圧が期待どおりに機能しないようです。まず、echo $?
次の行にunzipの戻りコードをエコーして成功することを確認してください。ls -l /tmp/sampleFolder
内容を見るには後で追加してください。
実行してbashのトレース出力を表示することもできます。set -x
これはスクリプトの作業順序も表示します。