/usr/local/bin プログラムが /usr/local/sbin にコピーされるのはなぜですか?

/usr/local/bin プログラムが /usr/local/sbin にコピーされるのはなぜですか?

今は再現できないようですが/usr/local/binに追加したプログラムの一部が/usr/local/sbin

私はbashスクリプトを書いたのでこれに気づきましたが、当時ターミナルで実行したときにまったく実行されない理由を理解していませんでした。私はwhereasすべてが注釈付きの古いコピーを使用して発見しました/usr/local/sbin。ファイルを削除した後、.../sbinコマンドラインからワーカースクリプトを実行すると実行されます。.../bin

以前whereisにリストされたファイルの出力。スクリプトが優先するのはなぜですか?そして、なぜこのファイルがコピーされたのか知っていますか?問題を認識する前に問題を解決しようとしたが、「sbin」として「bin」を何度も入力した可能性がありますが、その可能性はほとんどありません。binsbinsbinsbin

答え1

私が知っている限り、ディストリビューションにはユーザーが入力したスクリプトをコピーするメカニズムはなく、/usr/local/binその逆も同様です/usr/local/sbin

bash実行されたコマンドのパス名をキャッシュし、時にはそのキャッシュをフラッシュするためにそのコマンドを使用する必要があることをご存知でしたかhash

作業バージョンを追加する前に明示的なパスなしでスクリプトコマンドを試みると、/usr/local/binシェルは注釈付きバージョンを見つけて/usr/local/sbinそのパス名をキャッシュし、残りのセッション中にそれを記憶します。作業バージョンが追加された後も(パス検索の再実行)または(シェルセッションへのフルパスキャッシュフラッシュ)を実行しない限り、シェルセッションはそのバージョンを引き続き/usr/local/bin使用します。/usr/local/sbinhash <scriptname><scriptname>hash -r

また、シェルは、コマンドがハッシュされた場所に存在しなくなった場合、以前にハッシュされたコマンドの完全検索を自動的に再実行します。これは/usr/local/sbin/<scriptname>、削除後に期待される動作が復元される理由を説明します。

whereisはシェルの内部コマンドではないため、内部パスキャッシュについては何もわかりませんbashbash私の理論が正しい場合、このtype <scriptname>コマンド(に似ていますwhereisが組み込みbash)は次のことを報告します。

<scriptname> is hashed (/usr/local/sbin/<scriptname>)

発生した動作をトリガーするには、まずコメント付きのスクリプトバージョンをコピーしてから、スクリプトバージョンがまだ/usr/local/sbin存在しない場合は明示的なパスなしで一度実行してください/usr/local/bin。これは bin -> sbin の綴りを一度だけ間違えるようにします。

関連情報