するとき
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
。)