2

ファイルのリストを調べて、それらが存在するかどうかを確認し、ファイルが存在しない場合はエラーを出して終了したいと思います。次のコードを書きました。

FILES=( file1.txt file2.txt file3.txt )

for file in ${FILES[@]}; do
        [ -e "${file}" ] || ( echo "ERROR: ${file} does not exist" >&2 && exit )
done

エラーなしで実行され、次の結果が得られます (ファイルが存在しない場合)。

ERROR: file1.txt does not exist
ERROR: file2.txt does not exist
ERROR: file3.txt does not exist

「exit」が実行されないのはなぜですか? さらに、私がやろうとしていることを行うための好ましい方法を知りたいです (括弧でグループ化を制御します)。

4

1 に答える 1

5

サブプロセスとして実行( echo "ERROR: ${file} does not exist" >&2 && exit )している可能性があります (コマンドは () 内にあります)。したがって、サブプロセスを終了しています。これはシェル スクリプトのトレースです (私は で取得しましたset -x):

+ FILES=(file1.txt file2.txt file3.txt)
+ for file in '${FILES[@]}'
+ '[' -e file1.txt ']'
+ echo 'ERROR: file1.txt does not exist'
ERROR: file1.txt does not exist
+ exit
+ for file in '${FILES[@]}'
+ '[' -e file2.txt ']'
+ echo 'ERROR: file2.txt does not exist'
ERROR: file2.txt does not exist
+ exit
+ for file in '${FILES[@]}'
+ '[' -e file3.txt ']'
+ echo 'ERROR: file3.txt does not exist'
ERROR: file3.txt does not exist
+ exit

これは機能します:

set -x
FILES=( file1.txt file2.txt file3.txt )

for file in ${FILES[@]}; do
        [ -e "${file}" ] || echo "ERROR: ${file} does not exist" >&2 && exit
done

set -xファイルに入れて、自分自身を見てください。

または、このように

set -x
FILES=( file1.txt file2.txt file3.txt )

for file in ${FILES[@]}; do
        [ -e "${file}" ] || (echo "ERROR: ${file} does not exist" >&2) && exit
done

更新bash
について質問していると思います-コマンドのグループ化

これは、同じプロセスでグループ化して実行しています

FILES=( file1.txt file2.txt file3.txt )

for file in ${FILES[@]}; do
        [ -e "${file}" ] || { echo "ERROR: ${file} does not exist" >&2; exit; }
done

これは、サブプロセスでグループ化して実行しています

FILES=( file1.txt file2.txt file3.txt )

for file in ${FILES[@]}; do
        [ -e "${file}" ] || ( echo "ERROR: ${file} does not exist" >&2; exit )
done
于 2013-03-05T13:01:05.447 に答える