似たような質問がたくさんあることを知り、公開された提案を試しましたが、うまく動作しないようです。以下は私のコードです。
#!/bin/bash
while IFS="" read -d "" -r filename;
do
filearray[i++]="$filename"
done < <(find . -maxdepth 1 -type f -iname "*.txt" -print0)
printf '%s\n' "${filearray[0]}"
簡単に言えば、特定のディレクトリにあるすべてのtxt形式ファイルを検索して配列に入れて最後に表示したいと思います。コマンドラインから実行しても問題はありません。良い結果。 crontabを介してこれを実行すると、次のエラーが発生します。
syntax error near unexpected token `<'
`done < <(find . -maxdepth 1 -type f -iname "*.txt" -print0)'
これはcronエントリ自体です。
* * * * * . /usr/online/scripts/test.sh 2>> /usr/online/scripts/log/test.log
スクリプトがコマンドラインでは実行されますが、crontabでは実行されないのはなぜですか?シェルを宣言していますが、crontabはシェルを使用する必要がありますか?私がこれを行うもう一つの理由はありますか?
ジャッキー
答え1
command < <(other command)
はバシズム。 Shebang行を指定したので、次のことを行う必要があります。いいえcrontabでシェルを指定すると非常に混乱します。次のいずれかを選択する必要があります。私は本当にshebangラインが大好きです。これは、通常のシェルスクリプトであるふりをするのではなく、その背後にある構文を明示的に作成するためです。
ああ、スクリプトが実行可能であることを確認し、ただ /path/to/your/script.sh
crontab コマンドフィールドでいいえ sh /path/to/your/script.sh
、sh < /path/to/your/script.sh
さらに. /path/to/your/script.sh
。最後の3つはshebang行を無視し、代わりに設定に関係なくcronシェルのコンテキストでスクリプトを実行します。
バラよりリダイレクトのガイドラインスクリプト出力をファイルに保存する方法の詳細
答え2
スクリプトが実行可能でコマンドラインから呼び出されたときに正しい操作を実行すると仮定し、次のようにcrontabエントリを作成します(15分ごとに実行)。
*/15 * * * * /path/to/script.sh >/path/to/output 2>/path/to/errors