質問: Railsのスケジュール管理`whenever`で生成されるコマンドでは `/bin/bash -l -c`の引数としてコマンドが渡されていて、`-l` がログインシェルの振る舞いをし、`-c`が文字列をコマンドとして評価する事はわかったのですが、仮に`-l`オプションがなかった時に何か動作の違いがあるかどうかを知りたいです。 例えばcronを実行するユーザーのシェルが`bash`の時に ``` 0 * * * * bash -c "echo foo" ``` と ``` 0 * * * * echo foo ``` に何か違いはでますか? また何か違いを意識して置かなければならない状況はあるのでしょうか?
回答: crontab に書かれているコマンドは、ユーザーのログインシェルではなく crontab 内の `SHELL` 変数に指定されているものが使われます。何も指定されていない場合は `/bin/sh` です (参考: crontab(5))。 環境によっては `/bin/sh` の実体が bash の場合があるかもしれませんが、そうでない場合は `bash -c ...` と書かないと bash 固有の機能が使えません。 また、`/bin/sh` の実体が bash であっても、bash が `/bin/sh` として起動された場合には bash 用の設定ファイルは読み込まれない (`bash --norc` 相当) ので、動作環境が異なる場合があるかもしれません。bash が sh として起動された場合の動作の詳細については bash(1) を参照してください。