シェルがPATHと$ PATHを処理する方法を理解していません。以下を考慮してください。alias testCMD=PATH=$PATH
私は走ることができます
$ testCMD vim
しかし、宣言すると動作しません。alias testCMD=$PATH
私も走ることはできません:
$ PATH vim
または
$ $PATH vim
これは、他のエイリアスがどのように機能するかと比較してわずかに反直観的です。私の混乱を理解してください。
答え1
シェルには、次のようなさまざまな項目が保存されます。環境変数。 PATHは、これらの環境変数の1つの例にすぎません。
PATH変数が設定されていない場合は、実行される各プログラムのフルパスを手動で設定する必要があります。たとえば、ただ実行することはできず、毎回実行する必要がありますdate
。/usr/bin/date
後で Date のカスタムバージョンをインストールする場合/usr/local/bin/
に実行する必要があります/usr/local/bin/date
。
不便ではありませんが、不可能ではないため、実際にPATHはオプションであることがわかります。したがって、PATHの役割は、単にプログラムの位置を自動的に検出することです。
プログラムはシステム内のさまざまな場所にある可能性があるため、PATHは単純なディレクトリ以上です。代わりに、コロンで区切られたディレクトリのリストです。シェルでコマンドを実行すると、シェルは実行するコマンドを検索するためにこれらのディレクトリを検索します。
例に戻り、でカスタムツールの優先順位を設定するかどうかを設定し、そうでないdate
場合は置き換えることができます。その後、実行するとシェルがPATHリストの前半に表示されるため、そのシェルを削除してもPATHで2番目になるため、そのシェルを見つけることができます。PATH=/usr/local/bin:/usr/bin
/usr/local/bin
/usr/bin
/usr/local/bin
date
/usr/local/bin/
/usr/local/bin/date
/usr/local/bin/date
/usr/bin/date
/usr/bin/
これを実行すると、alias testCMD=PATH=$PATH
次のエイリアスが得られます。
testCMD='PATH=.:/usr/local/bin:/usr/bin:/bin'
したがって、実行時にtestCMD vim
シェルが見るのは次のようになります。
PATH=.:/usr/local/bin:/usr/bin:/bin vim
これは、シェルにどこを見なければならないかを知らせるワンタイムガイドラインを提供するだけですvim
。実行したばかりの場合、vim
testCMDエイリアスはPATH値を変更しないため、同じ結果が得られます。
PATHを変更すると、次の違いがあります。
$ PATH=/foo vim
bash: vim: command not found
シェルは名前付きのいくつかのディレクトリを見つけようとしますが、/foo
確かにそこにはないからです。vim
うまくいかない例に移動すると、変数の割り当てが行われなかったためです。PATH=/foo vim
との間には違いがありますPATH vim
。シェルはPATH vim
、ユーザーがというプログラムを見つけようとしていると思いますPATH
。その後、シェルは各ディレクトリで$PATH
名前付きプログラムを探しますPATH
。 (おそらく)これらのディレクトリにPATHコマンドがないため、次のような結果が得られます。
$ PATH vim
bash: PATH: command not found
vim
値をプレフィックスとして使用しても同じ原則が適用されます$PATH
。割り当てがないので、シェルは$PATH
これをいくつかのプログラムの名前だと思います。これがまさにあなたが得る理由です:
$ $PATH vim
bash: .:/usr/local/bin:/usr/bin:/bin: No such file or directory
一般的に、または~/.bashrc
さまざまな~/.bash_profile
ツールチェーンを切り替えたい場合は例外です。これは実際にPython virtualenvsの目的であり、PATHを自動的に再設定します。環境モジュールシステム、例:左型必要に応じてPATHを操作するもう1つの強力な方法です。