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

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

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

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

問題は、私//などがどこから来たのかwhichを確認するためにそれを使用しようとすると、エイリアスが邪魔になることです。vimgrepls

$ which vim
vim: aliased to vim -X

これは便利な出力ですが、この場合私が探している出力ではありません。vimエイリアスというのはわかりますが、vim -Xどこにいるのか知りたいです。それ vim出身だ。

使用できるように一時的にエイリアス定義を解放することに加えて、エイリアスを「ロック解除」して実行するwhich簡単な方法はありますか?which

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

答え1

which$SHELLこれは実際にこのようなタスクを実行する悪い方法です。これは、シェルが使用する起動ファイル(考える)に基づいて環境を推測するためです。時には間違って推測するだけでなく、別の方法で動作するように指示する方法もないことがよくあります。 (たとえば、 whichUbuntu 10.10では@SiegeXが言及したことを理解していません。)設定ファイルを表示するのではなく、現在のシェル環境を使用してその環境の一部を無視するように求められます。何が起こるのか、基本シェルが再構築されたときに起こるものではありません。--skip-aliastype

この場合、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見るための良い方法はありません。cshtcsh

答え2

存在するbash

type -P vim

存在するzsh

type -p vim

同時に:

/usr/bin/which vim

または:

( unalias vim; type vim )

答え3

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

答え4

別のオプションは、次のようcommand which vimに動作することです。zshbash

たとえば、私のMacでは、

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep

関連情報