エイリアスコマンドで「which」を使用する方法は?


76

ほとんどのユーザーと同様に、頻繁に使用するプログラムにデフォルトのフラグセットを提供するために、多数のエイリアスを設定しています。例えば、

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

問題はwhichvim/ grep/ ls/ etcがどこから来たのかを確認したい場合、エイリアスが邪魔になることです:

$ which vim
vim: aliased to vim -X

これは有用な出力ですが、この場合に私が探しているものではありません。私vimはエイリアスさvim -Xれていること を知っていますvimが、どこから来ているのか知りたいです。

エイリアスを一時的に定義解除するだけでは使用できませんが、エイリアスを「アンラップ」してその上で実行whichする簡単な方法はありwhichますか?

編集:which異なるシェル間で異なる動作をするシェル組み込みのようです。Bashでは、SiegeXによる--skip-aliasフラグの提案が機能します。ただし、私はZshを使用しています。似たようなものがそこにありますか?


zshでは、それvimがどこから来たのかを知りたい場合、使用しますwhere vim
Matija Nalis

回答:


105

which実際にこのようなことを行うのは悪い方法$SHELLです。これは、シェルが使用する環境と起動ファイル(と考える)に基づいて推測するためです。間違った推測をすることがあるだけでなく、一般的に振る舞いを変えることはできません。(which私のUbuntu 10.10では--skip-alias、@ SiegeXなどで言及されているように理解していません)type設定ファイルを突くのではなく現在のシェル環境を使用し、その環境の一部を無視するように指示できるため、実際に何が起こる かを示しますデフォルトシェルの再構築で起こることの代わりに起こります。

この場合、type -Pエイリアスまたは関数はバイパスされます。

$ type -P vim
/usr/bin/vim

また、すべてのレイヤーを一度に1つずつ剥がして、何が見つかるかを示すように依頼することもできます。

$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim

(コメントからこれを拡大:)

問題whichは、通常はシェル組み込みの代わりに外部プログラムであるということです。つまり、エイリアスや関数を見ることができず、シェルの起動/設定ファイルからそれらを再構築する必要があります。(シェルが組み込まれているがzsh、明らかにbashそうではない場合、シェルの環境を使用して正しいことを行う可能性が高くなります。)

typeは組み込みのように動作する必要があるPOSIX準拠のコマンドです(つまり、ローカルエイリアスと関数を含むから呼び出されたシェルの環境を使用する必要があります)。したがって、通常組み込みです。

通常、csh/ にはありませんtcshが、最新のバージョンでwhichはシェル組み込みであり、正しい動作をします。what代わりにビルトインが使用されることもあれば、現在のシェルの環境をcsh/ から見るための良い方法がない場合もありtcshます。


6
ありがとう!これは、私のトリックの袋に追加するのに非常に便利なものです。私は特に、それが最初のインスタンスだけでなく、あなたのすべてのインスタンスtype -aを返すようです。私はエイリアスが思うために:)$PATHwhichtype
エイドリアン・ペトレスク

2
@ geekosaur:ありがとう。typeがPOSIX標準の一部である場合は、それが進むべき方法です。私の質問に答えるために、typeはzsh(Debianでも)で動作します。なぜディストリビューションは削除されないのかwhatwhichもしそれらが標準化されておらず、追加の機能を持っていないのなら?
ファヒムミタ

1
いいえ、リモートでもです。
ギコサウルス

1
@Faheem:ドキュメントについては、info bash 'Bash builtins'Linuxから始めますが、zshリファレンスマニュアルから入手することもできます。より公式には、pubs.opengroup.org / onlinepubs / 009695399 / utilities / type.html(実際にはspec -Pまたは-a、または-pの元の形式であることに注意してくださいが-P、現在のシェル環境を使用する必要があります)。
-geekosaur

2
type -pzshとbashの間で異なる動作をします。type -Pzshにはまったく存在しません。
小次郎

15

bash

type -P vim

zsh

type -p vim

両者に:

/usr/bin/which vim

または:

( unalias vim; type vim )

2
最後はかっこいいです。これを行うエイリアスを持つことができます。:)
バルキ

redhatのbashでは、正しい答えが必要な場合、タイプ-Pを使用する必要があります。エイリアスや関数は関係ありません。

エヴァル博士、「どれ」?どのRed Hatですか?
ミケル

@Mikel RH7.4。GNU v2.20。

4

zshにwhichは、このコマンドが報告するビルトインがあります:

$ whence -w which
which: builtin

実行するには、外部コマンド(任意のシェルで)をwhich、使用フルパスを

$ /bin/which ls; echo $?
/bin/ls
0

したがって、コマンドlsが見つかり(終了値0)、にあり/bin/lsます。

インサイドzsh; 外部コマンドを検索する方法(上記以外)は次のとおりです。

$ whence -p ls
/bin/ls

ただし、次のようなネストされたエイリアスは解決されません。

$ alias dire='ls -l'

コマンドは、direコマンドが見つからなかったことを報告します。

$ whence -p dire; echo $?
1

ネストされたエイリアスの解決(手動)を参照 Resolve nested aliases to their source commands


2

そのように定義された鉱山

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

1

以下を試してください:

which --skip-alias vim

1
面白い!これはBashで機能しますが、Zshでは機能しません(これはシェルに依存するとは思っていませんでした)。これにより、これwhichは実際にはシェル組み込みであり、想定していた通常のUnixユーティリティではないことに気付きました。したがって、質問を編集してZshを指定する必要があります。これを指摘してくれてありがとう!
エイドリアンペトレスク

which少なくともDebianでは、組み込みではありません。これはシェルスクリプトであり、debianutilsの一部であるため、zshで動作します。ただし、Debianの--skip-aliasオプションではありませんwhich。さまざまな種類のwhich浮き輪がありますか?これは標準化されたコマンドではないようです。
ファヒムミサ

@Faheem Mitha:これはzshビルトインです。をご覧くださいman zshbuiltinswhich [-wpams] name ... whence -cと同等です。
ミケル

ええ、Xubuntu's bashには組み込みのものではなく、--skip-aliasオプションもありません。
polym 14

CentOS(およびRHEL?)6では、実行可能ファイル/usr/bin/whichにエイリアスが追加され/etc/profile.dていますが、エイリアスは処理できますが--skip-alias機能します。その結果which which、エイリアスはcommand which which表示されますが、実行可能ファイルは表示されます!
dave_thompson_085


0

シェルの種類に応じて、両方typewhich動作が異なります。

bashではwhich、コマンドはに存在しPATHます。で指定したコマンドを検索しますPATH。Bashビルトインtype -P(P for PATH)はまったく同じように動作しますwhich

ZSHでは、whichtypeは両方とも組み込み関数であり、builtinの部分関数ですwhencewhich -pあなたが望むものです。パス検索を強制します。(この-PオプションはtypeZSH では使用できません。)

whence [-vcwfpamsS] [-x num]名...

-p

名前がエイリアス、予約語、シェル関数または組み込みであっても、名前のパス検索を実行します。

ZSHマニュアルの詳細。

which [-wpamsS] [-x num] name ...

whence -cと同等です。

ZSH からbuiltin whichコマンドをスキップして強制的に使用するには:whichPATH

alias which="command which"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.