bashやパスの問題はありますか?

bashやパスの問題はありますか?

システム:マックビクサー

私は端末でより多くの作業をしていますが、ログイン中に定期的に別のメッセージを表示するのが楽しいと思いました。 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つ(またはそれ以上)のいずれかの方法でこの問題を解決できます。

  1. 自分で提案したように、すべてのコマンドに絶対パスを使用してください。

    唯一の例は、必要これを行うには、追加するディレクトリにユーティリティのいくつかのバリエーションがある場合は、PATH正しいユーティリティバリアントを選択することが重要です。

    たとえば、 and と you のlolcat両方があるとします。/usr/local/bin/opt/bin本物lolcatfromを使いたいです。また、inの代わりにinを/opt/bin使用したいと思います。この場合、2つのパスを追加することはできません。cowsay/usr/local/bin/opt/binPATH

  2. パイプラインを実行する前に、コマンドを含むディレクトリ(またはディレクトリ)をPATHスクリプトの変数に追加します。例えば、

    #!/bin/sh
    
    PATH=$PATH:/usr/local/bin
    
    fortune quotes | cowsay -f blowfish | lolcat >/etc/motd
    

    このPATH変数はすでに環境変数なので、エクスポートする必要はありません。これの利点は、スクリプトがコマンドへの絶対パスでいっぱいではないことです(読みやすくなります)。

  3. PATHcrontabからスクリプトを呼び出すときにこの変数を変更することもできます。

    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/shbash

おすすめ記事