ほとんどのユーザーと同様に、私は一般的に使用されているプログラムのデフォルトのフラグセットを提供するためにいくつかのエイリアスを設定しました。例えば、
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
問題は、私//などがどこから来たのかwhich
を確認するためにそれを使用しようとすると、エイリアスが邪魔になることです。vim
grep
ls
$ which vim
vim: aliased to vim -X
これは便利な出力ですが、この場合私が探している出力ではありません。vim
エイリアスというのはわかりますが、vim -X
どこにいるのか知りたいです。それ vim
出身だ。
使用できるように一時的にエイリアス定義を解放することに加えて、エイリアスを「ロック解除」して実行するwhich
簡単な方法はありますか?which
編集する:これはwhich
、他のシェルで異なる動作をするシェル組み込み関数のようです。 BashではSiegeXの--skip-alias
フラグ提案が機能しますが、私はZshを使用しています。似たようなものがそこに存在しますか?
答え1
which
$SHELL
これは実際にこのようなタスクを実行する悪い方法です。これは、シェルが使用する起動ファイル(考える)に基づいて環境を推測するためです。時には間違って推測するだけでなく、別の方法で動作するように指示する方法もないことがよくあります。 (たとえば、 which
Ubuntu 10.10では@SiegeXが言及したことを理解していません。)設定ファイルを表示するのではなく、現在のシェル環境を使用してその環境の一部を無視するように求められます。何が起こるのか、基本シェルが再構築されたときに起こるものではありません。--skip-alias
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
答え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
に動作することです。zsh
bash
たとえば、私のMacでは、
LOLcalhost :: ~ % command which grep
/usr/local/bin/grep