同僚と話し合っています。シェルスクリプト(インストールスクリプト、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を使用してクローンジョブを実行することを好みます。
答え2
許可された答えに加えて、絶対パスを使用する別の効果を追加したいと思います。シェル組み込みコマンドの使用を防ぎます。
たとえば、
echo
:shellは組み込みecho
コマンドを使用するecho
かPATH
。/bin/echo
:シェルがこのプログラムを使用するように強制します。このプログラムは組み込みコマンドより少し高価です。
よりリストBashのその他の組み込みコマンド。
組み込みコマンドに関する2つの質問があります。
POSIX許可するシェルは標準コマンドを組み込みコマンドとして実装します。「一般的に使用されるユーティリティのパフォーマンスを向上させるか、スタンドアロン環境でより困難な機能を実装する」、標準では組み込み機能が実行されると予想されるが、ただ検索で外部コマンドを使用できるPATH
場合多くの実装ではそうではありません。。
また、組み込みの実装が常に標準に準拠しているわけではありません。例えば、POSIX はprintf
以下より推奨しています。echo
後者は携帯性が悪いからです。
編集:有用な情報で更新されました隅に。