考虑一下我在当前 shell 中运行这些命令或将它们放入其中的情况.bashrc
:
alias source='echo hi'
alias .='echo hi'
alias unalias='echo hi'
或者function source(){ echo hi; }
等等。
对于二进制命令,我们可以使用绝对路径,例如:/bin/ls
,但是如何在当前 shell 中专门运行这些 shell 内置命令?
答案1
Bash 有这样的命令builtin
:
builtin: builtin [shell-builtin [arg ...]]
Execute shell builtins.
Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup.
例如
$ cat > hello.sh
echo hello
$ source() { echo x ; }
$ source hello.sh
x
$ builtin source hello.sh
hello
builtin
但是,没有什么可以阻止您重写。
解决别名(但不是函数)的另一种方法是引用该单词(部分):
$ alias source="echo x"
$ source hello.sh
x hello.sh
$ \source hello.sh
hello
答案2
始终可以通过引用命令名称的任何部分来绕过别名,例如\source
or'source'
或''source
or …(除非您也为那些允许的别名定义了别名zsh
,但其他 shell 不允许)。
在任何 POSIX shell 中都可以使用command
前缀(例如)来绕过函数。command source
在 bash 或 zsh 中,您可以使用builtin
而不是command
强制使用内置函数(如果没有该名称的内置函数,则command
回退到查找,而在 zsh 中(模拟其他 shell 时除外),则完全跳过内置函数)。您可以使用例如取消设置功能。PATH
command
unset -f source
如果您已覆盖或禁用所有builtin
、command
和unset
,您可能需要放弃将此 shell 实例恢复到合理状态的想法。