Bashでは、which
パスが順番に返されることがわかりますが、zshでは順序が異なります。
which
私は現在主にzshを使用しています。 zshで正しい出力ソートを取得するにはどうすればよいですか?なぜ違うの?順序が私のパスと一致したいと思います。
私のパスは次のとおりです/usr/local/bin:/usr/bin
bash$ which -a git
/usr/local/bin/git
/usr/bin/git
zsh$ which -a git
/usr/bin/git
/usr/local/bin/git -> ../Cellar/git/2.32.0/bin/git
答え1
あなたはそれを次のように定義しましたwhich
。
which(){
/usr/bin/which -a "$@" |
xargs ls -l |
tr -s ' ' |
cut -d ' ' -f 9-
}
ls
ファイル名は出力で語彙順にソートされ、その後に続きます。/usr/local/bin/git
/usr/bin/git
l
直後b
あなたの地域で。
GNUの実装には、このソートを無効にするオプションがls
あります-U
。
あなたのコマンドは、optionsを渡したときに見つかったすべてのコマンド名のパスを/usr/bin/which
印刷するコマンドのようです。組み込み関数では、¹を使用して同じことを実行できます。$PATH
-a
zsh
whence -pa
だからあなたはこれを行うことができます:
mywhich() (
set -o pipefail
zmodload zsh/stat
whence -pa "$@" |
while IFS= read -r f; do
if [[ -L $f ]] && stat -A l +link -- $f; then
print -r -- "$f -> $l"
else
print -r -- $f
fi
done
)
(これはすべてのファイルパスに改行文字が含まれていないと仮定します。)
GNUシステムでは、より正確なバージョンは次のとおりです。
mywhich() (
set -o pipefail
command which -a "$@" |
xargs -rd '\n' ls -ndU -- |
sed -E 's/([^ ]+ +){8}//'
)
それにもかかわらず、組み込みの機能がbash
ないため、出力はシェルに依存しません。ただ内蔵されたものがあります。which
which
tcsh
zsh
which
1しかし、あなたと同じように/usr/bin/which
(zshの組み込みとは異なり)、エイリアス、関数、組み込み、および実行可能テーブルwhich
までは無視されるため、シェルが実行するコマンドを必ずしも通知するわけではありません。$hash
また、見ることができます「which」を使わないのはなぜですか?それでは何を使うべきですか?