crontab と echo の奇妙な問題

crontab と echo の奇妙な問題
$ echo -e "test1\ntest2" > logfile

$ echo -e "test1\ntest2" >> logfile

$ cat logfile
test1
test2
test1
test2

$ rm logfile

$ crontab -e
* * * * * echo -e "test1\ntest2" >> logfile

$ sleep 160

$ cat logfile
-e test1
test2
-e test1
test2

なぜ出力に が表示されるのですか-e? crontabとbashの両方が使用しています/bin/echo

答え1

彼らはおそらくないどちらも を使用しています/bin/echo。 が使用する環境は、cron対話型環境とは異なる可能性があります。確実にするためにフルパスを指定してください。

答え2

printfこれが、携帯性のためにの代わりにを使用することを推奨する理由の 1 つですecho

* * * * * printf "test1\ntest2\n" >> logfile

cronを使用するシェルはshBash ではなく です。私のシステムでは、shは実際には Dash であり、 がechoありません-e。そのため、-eは出力される単なる別の文字列になります。Bourne シェルの他のバージョンや、その機能を提供するシェルには がある場合があります-e

echoでフルパスを指定せずに を使用すると、 ではなくシェルの組み込みバージョンが取得されます。コマンド ラインで Bash を使用している場合、フルパスを指定せずにを使用するとcrontab、Bashの組み込みバージョンが取得されます。echo/bin/echoecho

関連情報