私の最後の行.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
..をオーバーライドすると思っていました。
私の最後の行.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
どこでも動作するようにしたい場合$HOME/bin
は、PATH
リストの先頭に追加して、ポイント$HOME/bin/cp
するようにポイントします。
ln -s /usr/local/bin/gcp $HOME/bin/cp
これによりシンボリックリンクが作成されますが、少し効率的なハードリンクにすることもできますが(省略-s
)、通常はルート権限(sudo ln ...
)が必要になります。関数の作成とPATH
変数への追加は、bash
ユーザー権限を使用して、起動スクリプトの1つで実行されます。
which
その実行/usr/bin/which
の入力と出力からパイプalias
とそれが一致した場合、エイリアスを表示するためにその入力を読んで、それを使用することを伝えオプションコマンド。unix.stackexchange.com/questions/10525/…を
which
を設定するだけで同じ効果を得ることができますtype
。その後which -a
、外部プログラムのように動作し、エイリアスと関数定義が追加されます。エイリアスや関数の定義をバイパスして、外部プログラムの使用を強制したいときにalias which=type
使用$(which ProgName)
したいので、一般的には使用しません。
ln
提案は、ホームディレクトリがと同じファイルシステム上にある場合にのみ機能します/usr/local/bin
。またgcp
、ハードリンクが古いバージョンを参照している可能性があるため、を更新すると奇妙な動作をします。
gcp
については、更新を開いて作成するか、削除して再作成するかによって異なります。シンボリックリンクには通常絶対パスが必要ですが、ハードリンクの作成に絶対ソースパスと相対ソースパスのどちらを使用するかは重要ではありません。リンクはOSで広く使用されており、ほとんどがシンボリックです。
エイリアスはシェルの内部にあります。他のプログラムはそれらについて知りません。
which
Bashビルトインではありません(zshなどの他のシェルのビルトインです)。にwhich
はBashのエイリアスに特権情報がないため、指定された用語をwhich
調べPATH
ます。
type
一方で、それは別名を報告することができますので、バッシュの組み込み。
PATH
。