ほとんどのユーザーと同様に、私は頻繁に使用されるプログラムにデフォルトのフラグセットを提供するために、多数のエイリアスを設定しています。例えば、
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
問題は、which
を使用してvim
/grep
/ls
/etcがどこから来ているのかを確認したい場合、エイリアスが仕方:
$ which vim
vim: aliased to vim -X
これは便利な出力ですが、この場合に探しているものではありません。 vim
がvim -X
のエイリアスであることは知っていますが、thatvim
がどこから来ているのか知りたいです。
which
を使用できるように一時的にエイリアスの定義を解除するのではなく、エイリアスをwhich
で「アンラップ」して簡単に実行する方法はありますか?
編集:which
は、シェルごとに異なる動作をするシェル組み込みであるようです。バッシュでは、SiegeXの--skip-alias
フラグの提案が機能します。ただし、私はZshを使用しています。似たようなものはありますか?
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
から確認するのに適した方法がない場合もあります。
bash
内:
type -P vim
zsh
内:
type -p vim
両者に:
/usr/bin/which vim
または:
( unalias vim; type vim )
このコマンドが報告するように、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
を参照してください
そのように定義された鉱山
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
以下を試してください:
which --skip-alias vim
type
とwhich
は、シェルのタイプによって動作が異なります。
Bashでは、which
はPATH
に存在するコマンドです。 PATH
で指定したコマンドを検索します。 Bash組み込みtype -P
(PATH
のP)はwhich
とまったく同じように動作します。
ZSHでは、which
とtype
はどちらも組み込みであり、組み込みwhence
の部分関数です。 which -p
はあなたが欲しいものです。パス検索を強制します。 (-P
オプションはtype
ZSHでは使用できません。)
whence [-vcwfpamsS] [-x num] name ...
-p
別名、予約語、シェル関数、または組み込みであっても、名前のパス検索を実行します。
ZSHマニュアルの詳細。
which [-wpamsS] [-x num] name ...
Whence -cと同等です。
ZSHでbuiltin
which
をスキップしてwhich
からコマンドPATH
を強制的に使用するには:
alias which="command which"
別の選択肢はcommand which vim
、これはzsh
とbash
の両方で同じように機能します
例えば。私のMacで:
LOLcalhost :: ~ % command which grep
/usr/local/bin/grep