Bashでコマンドを解析する方法は? [コピー]

Bashでコマンドを解析する方法は? [コピー]

するとき

which python、入場中です(状態/usr/bin/python

するとき

which python3、入場中です(状態/usr/bin/python3

ただし、実行された場合はalias python=/usr/bin/python3まだwhich pythonを返します/usr/bin/python

これはbashコマンドを見つけるのにもっと複雑なロジックがあると思われますが、それは見つけることができません。おそらく名前がわからないようです。

それでは、bashはどのようにコマンドを探しますか?


コメントに返信するには編集してください。

出力ビューalias

noam@ML:~/src/uv-car-parts-segmentation$ which python
/usr/bin/python
noam@ML:~/src/uv-car-parts-segmentation$ which python3
/usr/bin/python3
noam@ML:~/src/uv-car-parts-segmentation$ alias python=/usr/bin/python3
noam@ML:~/src/uv-car-parts-segmentation$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias python='/usr/bin/python3'
noam@ML:~/src/uv-car-parts-segmentation$ which python
/usr/bin/python

これはドキュメントですコマンドを解析する方法については、これがこの問題に対する解決策ではないようです。

答え1

which通常、問題のシェルエイリアスやシェル機能に関する知識がない外部コマンドです。で一致するコマンド名のみを探しますPATH

type pythonエイリアスは認識され、typeすべてのPOSIXyシェルで動作します。少なくとも Bash とは異なる一部では、type -a特定の名前のすべての項目を表示するために使用できます。ただし、エイリアスが指す場所を追跡せず、エイリアスなしで使用されるパス名のみを表示します。

$ alias python=/usr/bin/python3
$ type -a python
python is aliased to '/usr/bin/python3'
python is /usr/bin/python

望むより:「which」を使わないのはなぜですか?それでは何を使うべきですか?

Bash自体は、コマンドライン処理の最初にエイリアスを処理し、拡張後の最初の単語が(1)関数(2)組み込み関数か(3)外部コマンドかを確認します。

(最初の単語が引用符でないリテラルキーワードではないif場合は、適切な構文を使用して解析されます。たとえば、またはという"if"外部/path/to/ifコマンドを実行する必要がありますif。)

関連情報