エイリアスはPATHエントリを「上書き」しませんか?


9

私の最後の行.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..をオーバーライドすると思っていました。


1
記録:技術的には、エイリアスはenvarの値をオーバーライドしませんPATH
can-ned_food 2017

必須の注意:一般に、一般的なコマンドの名前を変更することはお勧めできません。これには2つの方法があります。1)別のシステムで作業していて、習慣によってコマンドを使用すると、ネイティブコマンドの予期しない動作が発生します。2)他の誰かがあなたのシステムを使用している場合、問題の解決をアドバイス/支援する場合でも、カスタマイズの予期しない動作が発生します。カスタムコマンドは問題ありませんが、一般的な既存のコマンドと同じ名前を付けないでください。
Joe

@joe実際にそれがあるよりのこちら:のOS / XバージョンCPがからオプション欠け予想通り、それは(のように*人には以外に動作しないようにnixのを足かせMac版)
javadba

回答:


21

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

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

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

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つで実行されます。


1
CentOSの(とAIUIすべてのRedHatの)標準プロファイル(上書きされない限り)で作成しますが、別名をするためにwhichその実行/usr/bin/whichの入力と出力からパイプaliasとそれが一致した場合、エイリアスを表示するためにその入力を読んで、それを使用することを伝えオプションコマンド。unix.stackexchange.com/questions/10525/…を
dave_thompson_085

@ dave_thompson_085-興味深いコメント:これらのディストリビューションは使用していません。私はUbuntuを使用していますが、単ににエイリアスwhichを設定するだけで同じ効果を得ることができますtype。その後which -a、外部プログラムのように動作し、エイリアスと関数定義が追加されます。エイリアスや関数の定義をバイパスして、外部プログラムの使用を強制したいときにalias which=type使用$(which ProgName)したいので、一般的には使用しません。
AFH 2017

1
ハードリンクはファイルシステムをクロスできないため、非シンボリックなln提案は、ホームディレクトリがと同じファイルシステム上にある場合にのみ機能します/usr/local/bin。またgcp、ハードリンクが古いバージョンを参照している可能性があるため、を更新すると奇妙な動作をします。
役に立たない

@Useless-有効なポイント。これは、シンボリックリンクを最初に提案するように回答を編集した理由の一部ですが、アクセス許可はおそらく最も重要な考慮事項だと思います。更新gcpについては、更新を開いて作成するか、削除して再作成するかによって異なります。シンボリックリンクには通常絶対パスが必要ですが、ハードリンクの作成に絶対ソースパスと相対ソースパスのどちらを使用するかは重要ではありません。リンクはOSで広く使用されており、ほとんどがシンボリックです。
AFH 2017

1
@ can-ned_food-現在のシェルで設定するほど簡単ではありません。エイリアスをインポートするとともに、各スクリプトで設定する必要があります。
AFH 2017

13

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

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

type一方、それは別名を報告することができますので、バッシュの組み込み。


2
また、エイリアスは、コマンドの最初の単語の場合にのみ展開されます。多分それは関係ありません。
can-ned_food 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.