私は次のスクリプトを書いた。
"find . -name '*'.cpp | $IN_REGEX | grep $IN_REGEX | grep -v $OUT_REGEX` する echo "出力ファイルは$ OUTPUT_FILEです。" count=`git log --pretty=フォーマット: --name-only $filename | grep -v ^$ | echo "$count $filename" >> $OUTPUT_FILE 完璧
ただし、出力ファイルには何も記録されません。
注:
OUTPUT_FILE
IN_REGEX
、 、 の値を設定しましたOUT_REGEX
。- ループ内のコードが実行されています。
sh -x
電話して確認してみました。 - 削除すると
>> $OUTPUT_FILE
出力が表示されます。 touch $OUTPUT_FILE
スクリプト内で試してみましたが、うまくいきます。
誰かが私の間違いを指摘できますか?
答え1
$OUTPUT_FILEは存在しますか?その権限(ls -l $OUTPUT_FILE
、、)は何ですかgetfacl $OUTPUT_FILE
?何回実行されましたかecho "Output file..."
? (私はそれを省略したいが、for
それはあなたの決定です)?
find ...
(あなたのパイプが何も返さないようです)
答え2
この問題を解決するのに役立ついくつかのアイデアは次のとおりです。
ファイルへの標準リダイレクトの代わりにファイルをパイプして
tee
含めます。 stdoutで出力を確認して$OUTPUT_FILEに移動することを願っています。たとえば、echo "$count $filename" ティー $OUTPUT_FILE |
$OUTPUT_FILE では、相対パスではなく絶対パスを使用して呼び出しスクリプトの場所に依存しないようにしてください。相手を使用すると、正しい場所で出力ファイルが見つからない可能性があります。
-x を使ってスクリプトを呼び出すと、スクリプトの実行時に何が起こるかを正確に確認できます。リダイレクト時に $OUTPUT_FILE 値を必ず設定してください。
shを使用しない場合は、bashでスクリプトを試すことができます。その後、set組み込みを使用していくつかのbashオプションを使用できます(参考資料を参照
help set
)。スクリプトを開発するときにゼロ以外の終了ステータスが返された場合は、スクリプトが終了するように "set -e"を実行すると便利です。パイプラインのエラー状態を処理する必要があるかもしれません。したがって、デバッグを支援するために、スクリプトをスクリプトの上に置くことができます。set -x set -e # Optionally: set -o pipefail