システム:マックビクサー
私は端末でより多くの作業をしていますが、ログイン中に定期的に別のメッセージを表示するのが楽しいと思いました。 Fortuneコマンドを.bash_profileに追加できることを知っていますが、システム内のすべてのユーザーに対してmotdとして実行し、launchd / crontabを使用してスケジュールしたいと思います。前回スクリプトをrootとして実行するようにcrontabを設定しましたが、スクリプトでコマンドが見つからないというエラーが電子メールで送信されました。これは私のスクリプトです。
#!/bin/bash
#create a motd to be run by crontab every hour
fortune quotes | cowsay -f blowfish | lolcat > /etc/motd
まだ試していませんが、それが問題の場合は、実行可能ファイルの絶対パスを使用できると思います。それとも、コマンドの周りにバックティックを入れる必要がありますか?ファイルの場所の検索パスを取得するには、ルートの.bashrcファイルを変更する必要がありますか?
答え1
問題は、スクリプトに正しい環境変数の値がないためである可能性が高いですPATH
。とにかく、これはどんな文法問題でもありません。
次の3つ(またはそれ以上)のいずれかの方法でこの問題を解決できます。
自分で提案したように、すべてのコマンドに絶対パスを使用してください。
唯一の例は、必要これを行うには、追加するディレクトリにユーティリティのいくつかのバリエーションがある場合は、
PATH
正しいユーティリティバリアントを選択することが重要です。たとえば、 and と you の
lolcat
両方があるとします。/usr/local/bin
/opt/bin
本物lolcat
fromを使いたいです。また、inの代わりにinを/opt/bin
使用したいと思います。この場合、2つのパスを追加することはできません。cowsay
/usr/local/bin
/opt/bin
PATH
パイプラインを実行する前に、コマンドを含むディレクトリ(またはディレクトリ)を
PATH
スクリプトの変数に追加します。例えば、#!/bin/sh PATH=$PATH:/usr/local/bin fortune quotes | cowsay -f blowfish | lolcat >/etc/motd
この
PATH
変数はすでに環境変数なので、エクスポートする必要はありません。これの利点は、スクリプトがコマンドへの絶対パスでいっぱいではないことです(読みやすくなります)。PATH
crontabからスクリプトを呼び出すときにこの変数を変更することもできます。0 * * * * PATH=$PATH:/usr/local/bin /path/to/my-motd-script.sh
(またはあなたのスケジュールは何でも)スクリプト環境で設定するには、次のようにコマンドラインで変数を設定します。
env
同じ効果を持つユーティリティを使用することもできます。0 * * * * env PATH="$PATH:/usr/local/bin" /path/to/my-motd-script.sh
これにより、現在のスクリプトを変更されていない状態に保つことができます。
非対話型シェルセッション(cron操作など)はファイルを読み取らないため、PATH
ルートディレクトリでファイルを変更しても効果はありません。.bashrc
スクリプトに実際に必要なものがないため、この行を#!
変更しました。この場合、実際の機能よりも審美的な面に関連しています。#!/bin/sh
bash