同僚と話し合っています。シェルスクリプト(インストールスクリプト、cronjobなど)でコマンドへのフルパスを明示的に指定する方が良いですか?
たとえば、スクリプトユーザーがシステムを設定した可能性があります(またはハッキングされた可能性があります(この場合、すべての賭けが失敗する可能性があります))。同じ名前のコマンドがシステムの他の場所に存在し、スクリプトが依存するコマンドより前のコマンド検索パスは、予期しないまたは望ましくない結果を生成する可能性があります。
スクリプトが予想されるコマンドを使用するようにフルパスを指定することは価値がありますか、それとも過度に考えていますか?
ベストアンサー1
これは状況によって異なり、どちらのオプションにも長所と短所があります。通常、私は非常に特別な理由がない限り、絶対パスを使用しません。
PATH 環境変数を使用した呼び出し
絶対パスを指定せずにコマンドを呼び出すと(IEはPATH
ディレクトリ内のコマンドを使用)、スクリプトの移植性が向上します。これは、プログラムでは問題になる可能性が低いですが、使用したいすべての/bin
コマンドでは確かにそうです/usr/bin
。さまざまなシステムで、/opt
またはなど、さまざまな場所に配置できます/snap
。
悪いことに、ユーザーはさまざまな理由でルートを設定できます。これには、複数のJavaランタイムまたはPythonバージョンのインストールなどが含まれます。したがって、システム管理者がスクリプトと互換性のないバージョンをインストールしている可能性があるため、呼び出しはjava
ほとんど発生しないでください。/usr/bin/java
ユーザーが使用するJavaバージョンを選択できるようにすることが重要です。
別の例は、いくつかのディストリビューションが予想される規則に必ずしも従わないということです。実際、Archlinuxは/bin
/sbin
/usr/bin
/usr/sbin
他のディレクトリへのシンボリックリンクを使用してすべてを1つのディレクトリにまとめました(ねえ)。これは以前のバージョンと互換性がなければなりませんが、いくつかの標準は思ったほど一般的ではないことを示しています。
次のツールに注意してください。Sudo組み込みの PATH 環境変数に対する特定の保護機能があるため、絶対パスを指定しなくても、通常 sudo で実行する必要があるスクリプトが安全であると仮定するのは安全です。
絶対パスを使用して呼び出す
通常、絶対パスは非常に具体的な理由がある場合にのみ使用してください。
絶対パスを使用する主な利点は、実行中のコマンドをより効果的に制御できることです。ここでは、カスタムパスをオーバーライドするように設計された特定の代替ツールをインストールできます。
セキュリティ問題を指摘しました。これを行うにはいくつかの方法がありますが、前述のようにsudo
コマンドを実行することはほとんど問題ありません。
cronスクリプトに言及しました。有名なcronのPATH環境変数には期待どおりに設定されないことが多いという点で問題があります(ねえ)。私は過去にcronで使用するための絶対パスを含むスクリプトを作成しました。これは、それをインストールしたシステム管理者を信頼しないことに関連しています。私は常にスクリプトの絶対パスではなく、よく設定されたPATHを使用してクローンジョブを実行することを好みます。