私の.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
をオーバーライドすると思っていました。
which
コマンドは実行可能ファイルのみを返します。これは外部プログラムであるため、エイリアスについて何も認識せず、エイリアス情報を子プロセスに渡すメカニズムがありません。
コマンドtype -a cp
を入力すると、すべての可能な解釈が優先順に表示されます。 type
はbash
内部コマンドであるため、これにはすべてのエイリアスが含まれます。
エイリアスは、スクリプトやシステムコマンドを実行するオプションのあるインタラクティブエディタなどのサブプロセスによって解釈されないことを理解することが重要です。
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つで行われます。
エイリアスはシェルの内部にあります。他のプログラムはそれらについて知りません。
which
はBashビルトインではありません(zshなどの他のシェルのビルトインです)。 which
にはBashのエイリアスに対する特権情報がないため、which
は指定された用語についてPATH
を調べるだけです。
一方、type
is Bashが組み込まれているため、エイリアスについてレポートできます。