如何专门运行 shell 内置命令

如何专门运行 shell 内置命令

考虑一下我在当前 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

始终可以通过引用命令名称的任何部分来绕过别名,例如\sourceor'source'''sourceor …(除非您也为那些允许的别名定义了别名zsh,但其他 shell 不允许)。

在任何 POSIX shell 中都可以使用command前缀(例如)来绕过函数。command source在 bash 或 zsh 中,您可以使用builtin而不是command强制使用内置函数(如果没有该名称的内置函数,则command回退到查找,而在 zsh 中(模拟其他 shell 时除外),则完全跳过内置函数)。您可以使用例如取消设置功能。PATHcommandunset -f source

如果您已覆盖或禁用所有builtincommandunset,您可能需要放弃将此 shell 实例恢复到合理状态的想法。

相关内容