どのコマンドに出力順序がありますか? [閉鎖]

どのコマンドに出力順序がありますか? [閉鎖]

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/gitl直後bあなたの地域で。

GNUの実装には、このソートを無効にするオプションがlsあります-U

あなたのコマンドは、optionsを渡したときに見つかったすべてのコマンド名のパスを/usr/bin/which印刷するコマンドのようです。組み込み関数では、¹を使用して同じことを実行できます。$PATH-azshwhence -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ないため、出力はシェルに依存しません。ただ内蔵されたものがあります。whichwhichtcshzshwhich


1しかし、あなたと同じように/usr/bin/which(zshの組み込みとは異なり)、エイリアス、関数、組み込み、および実行可能テーブルwhichまでは無視されるため、シェルが実行するコマンドを必ずしも通知するわけではありません。$hashまた、見ることができます「which」を使わないのはなぜですか?それでは何を使うべきですか?

関連情報