web-dev-qa-db-ja.com

エイリアスはPATHエントリを「オーバーライド」しませんか?

私の.bash_profileの最後の行は次のとおりです。

alias cp=/usr/local/bin/gcp

しかし、それは私の$PATHのエントリによって押しつぶされています。

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

エイリアスがPATHをオーバーライドすると思っていました。

9
javadba

whichコマンドは実行可能ファイルのみを返します。これは外部プログラムであるため、エイリアスについて何も認識せず、エイリアス情報を子プロセスに渡すメカニズムがありません。

コマンドtype -a cpを入力すると、すべての可能な解釈が優先順に表示されます。 typebash内部コマンドであるため、これにはすべてのエイリアスが含まれます。

エイリアスは、スクリプトやシステムコマンドを実行するオプションのあるインタラクティブエディタなどのサブプロセスによって解釈されないことを理解することが重要です。

cpを関数にすると、他のプログラムからではなく、バージョンがスクリプトで実行されます。

cp() { /usr/local/bin/gcp "$@"; }

cpをあらゆる場所で機能させたい場合は、PATHリストの先頭に$HOME/binを追加し、$HOME/bin/cpをポイントしてポイントします。

ln -s /usr/local/bin/gcp $HOME/bin/cp

これによりシンボリックリンクが作成されますが、少し効率的なハードリンク(-sを省略)にすることもできますが、通常はルート権限(Sudo ln ...)が必要になります。関数の作成とPATH変数への追加は、ユーザー権限を持つbash起動スクリプトの1つで行われます。

21
AFH

エイリアスはシェルの内部にあります。他のプログラムはそれらについて知りません。

whichはBashビルトインではありません(zshなどの他のシェルのビルトインです)。 whichにはBashのエイリアスに対する特権情報がないため、whichは指定された用語についてPATHを調べるだけです。

一方、typeis Bashが組み込まれているため、エイリアスについてレポートできます。

13
8bittree