今は再現できないようですが/usr/local/binに追加したプログラムの一部が/usr/local/sbin
。
私はbashスクリプトを書いたのでこれに気づきましたが、当時ターミナルで実行したときにまったく実行されない理由を理解していませんでした。私はwhereas
すべてが注釈付きの古いコピーを使用して発見しました/usr/local/sbin
。ファイルを削除した後、.../sbin
コマンドラインからワーカースクリプトを実行すると実行されます。.../bin
以前whereis
にリストされたファイルの出力。スクリプトが優先するのはなぜですか?そして、なぜこのファイルがコピーされたのか知っていますか?問題を認識する前に問題を解決しようとしたが、「sbin」として「bin」を何度も入力した可能性がありますが、その可能性はほとんどありません。bin
sbin
sbin
sbin
答え1
私が知っている限り、ディストリビューションにはユーザーが入力したスクリプトをコピーするメカニズムはなく、/usr/local/bin
その逆も同様です/usr/local/sbin
。
bash
実行されたコマンドのパス名をキャッシュし、時にはそのキャッシュをフラッシュするためにそのコマンドを使用する必要があることをご存知でしたかhash
?
作業バージョンを追加する前に明示的なパスなしでスクリプトコマンドを試みると、/usr/local/bin
シェルは注釈付きバージョンを見つけて/usr/local/sbin
そのパス名をキャッシュし、残りのセッション中にそれを記憶します。作業バージョンが追加された後も(パス検索の再実行)または(シェルセッションへのフルパスキャッシュフラッシュ)を実行しない限り、シェルセッションはそのバージョンを引き続き/usr/local/bin
使用します。/usr/local/sbin
hash <scriptname>
<scriptname>
hash -r
また、シェルは、コマンドがハッシュされた場所に存在しなくなった場合、以前にハッシュされたコマンドの完全検索を自動的に再実行します。これは/usr/local/sbin/<scriptname>
、削除後に期待される動作が復元される理由を説明します。
whereis
はシェルの内部コマンドではないため、内部パスキャッシュについては何もわかりませんbash
。bash
私の理論が正しい場合、このtype <scriptname>
コマンド(に似ていますwhereis
が組み込みbash
)は次のことを報告します。
<scriptname> is hashed (/usr/local/sbin/<scriptname>)
発生した動作をトリガーするには、まずコメント付きのスクリプトバージョンをコピーしてから、スクリプトバージョンがまだ/usr/local/sbin
存在しない場合は明示的なパスなしで一度実行してください/usr/local/bin
。これは bin -> sbin の綴りを一度だけ間違えるようにします。