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通常/经常是一个外部命令,它不知道 shell 别名或与此相关的 shell 函数。它只在 中查找匹配的命令名称PATH

type python会识别别名,并且type应该在所有 POSIXy shell 中工作。至少在 Bash 和其他一些中,type -a可用于显示给定名称的所有匹配项。不过,它不会跟踪别名指向的位置,只是显示没有别名时将使用的路径名:

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

看:为什么不用“哪个”呢?那该用什么呢?

Bash 本身会在命令行处理的早期首先处理别名,然后检查所有扩展后的第一个单词是否是 (1) 函数 (2) 内置函数或 (3) 外部命令。

(除非第一个单词是不带引号的文字关键字if,例如 ,在这种情况下,它将使用适当的语法进行解析。您需要例如"if"/path/to/if来运行名为 的外部命令if。)

相关内容