私の最後の行.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で広く使用されており、ほとんどがシンボリックです。
エイリアスはシェルの内部にあります。他のプログラムはそれらについて知りません。
whichBashビルトインではありません(zshなどの他のシェルのビルトインです)。にwhichはBashのエイリアスに特権情報がないため、指定された用語をwhich調べPATHます。
type一方で、それは別名を報告することができますので、バッシュの組み込み。
PATH。