web-dev-qa-db-ja.com

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

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

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

問題は、whichを使用してvim/grep/ls/etcがどこから来ているのかを確認したい場合、エイリアスが仕方:

$ which vim
vim: aliased to vim -X

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

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

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

79
Adrian Petrescu

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

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

$ type -P vim
/usr/bin/vim

allレイヤーを一度に1つずつはがして、何が見つかるかを示すこともできます。

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

(コメントからこれを拡張する:)

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

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

csh/tcshにはほとんど含まれていませんが、最新バージョンのwhichはShellビルトインであり、正しいことを行います。組み込みがwhatの場合もあれば、現在のシェルの環境をcsh/tcshから確認するのに適した方法がない場合もあります。

111
geekosaur

bash内:

type -P vim

zsh内:

type -p vim

両者に:

/usr/bin/which vim

または:

( unalias vim; type vim )
16
Mikel

このコマンドが報告するように、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 を参照してください

5
user79743

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

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

以下を試してください:

which --skip-alias vim
1
SiegeX

typewhichは、シェルのタイプによって動作が異なります。

Bashでは、whichPATHに存在するコマンドです。 PATHで指定したコマンドを検索します。 Bash組み込みtype -PPATHのP)はwhichとまったく同じように動作します。

ZSHでは、whichtypeはどちらも組み込みであり、組み込みwhenceの部分関数です。 which -pはあなたが欲しいものです。パス検索を強制します。 (-Pオプションはtype ZSHでは使用できません。)

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

-p

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

ZSHマニュアルの詳細。

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

Whence -cと同等です。

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

alias which="command which"
0
Simba

別の選択肢はcommand which vim、これはzshbashの両方で同じように機能します

例えば。私のMacで:

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep
0
Zee Alexander