做的时候
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
。)