私はSTDERRとループの初期テスト段階で2>をいつ/どこに配置するかをよりよく理解しようとしています。
私のスクリプトは次のとおりです...
#!/bin/bash
file1=/tmp/file1
file2=/tmp/file2
if [ -e $file1 -o -e $file2 ]; then
if ls $file1 2>> err.log ; then
echo "file1 exists" | tee -a job.log
fi
if ls $file2 2>> err.log ; then
echo "file2 exists" | tee -a job.log
fi
else
echo "neither $file1 or $file2 exists"
fi
しかし、file1またはfile2が存在しない場合は、err.logに以下を追加したいと思います。
ls: /tmp/file1 にアクセスできません: そのファイルまたはディレクトリがありません
しかし、err.logには何も記録されません。何を見逃しているのかよくわかりませんが、論理は簡単だと思います。
どんな洞察力でも高く評価されます。
答え1
CASが指摘したように、.を不必要に使用していますls
。スクリプトは次のように書くことができます。
#!/bin/bash
file1='/tmp/file1'
file2='/tmp/file2'
if [[ -e "$file1" ]]; then
echo "file1 exists" | tee -a job.log
else
echo 'ls: cannot access /tmp/file1: No such file or directory' >>err.log
fi
if [[ -e "$file2" ]]; then
echo "file2 exists" | tee -a job.log
else
echo 'ls: cannot access /tmp/file2: No such file or directory' >>err.log
fi
[[ ! -e "$file1" && ! -e "$file2" ]] && echo "neither $file1 or $file2 exists"
lsエラーはおそらく変更する必要がありますが、これがエラーファイルで見たいものなので、そのままにしておきます。 :)
答え2
ファイルが1つ以上存在する場合は、そのファイルにエラーを記録する必要があります。両方がない場合、if
文はelse
まったく実行されない句に直接移動します。ls
エラーメッセージを追加する場合両方ファイルが存在しません。else
次のようにセクションで手動で実行できます。
#!/bin/bash
file1=/tmp/file1
file2=/tmp/file2
if [ -e $file1 -o -e $file2 ]; then
if ls $file1 2>> err.log ; then
echo "file1 exists" | tee -a job.log
fi
if ls $file2 2>> err.log ; then
echo "file2 exists" | tee -a job.log
fi
else
echo "neither $file1 or $file2 exists"
ls $file1 2>> err.log
ls $file2 2>> err.log
fi
ls
ファイルが存在しないことを知っていてもコマンドが実行されるため、ファイルにコマンドエラーが記録されます。
このコードは実用的な観点からはあまり意味がありませんが、学習目的でのみ書かれたものであれば問題になりません。