确保内置命令在异常情况下运行

确保内置命令在异常情况下运行

考虑到恶劣的环境,例如:

for word in builtin command type unfunction declare set unset alias; do
    eval "$word(){ echo $word function; };  alias $word='echo $word alias'"
done 

是否可以访问内置命令?例如,是否可以执行以下操作:

\command \builtin \type echo

仍然看到:

echo is a shell builtin

敌对(或锁定)环境是否有可能完全重新定义事物,使得底层内置函数、函数或路径名永远无法被访问?

答案1

对于 Bash,如果您启用POSIX模式:

  1. 函数名称可能与 POSIX 特殊内置函数之一不同。
  2. 在命令查找期间,在 shell 函数之前找到 POSIX 特殊内置函数。

由于setunset是特殊的内置函数,您可以通过 POSIX 模式访问它们,然后使用它们来删除函数,然后使用 来\unalias删除别名:

$ for word in builtin command type  declare set unset unalias alias; do     eval "$word(){ echo $word function; };  alias $word='echo $word alias'"; done 
alias function
$ unalias  builtin command type unfunction declare set unset alias
unalias alias builtin command type unfunction declare set unset alias
$ POSIXLY_CORRECT=1
$ \unset -f builtin command type  declare set unset unalias alias
$ \unalias  builtin command type unfunction declare set unset alias
bash: unalias: unfunction: not found
bash: unalias: alias: not found

$ type -a builtin
builtin is a shell builtin

但我想不出办法回来,比如说:

enable -n set unset builtin command type  declare unalias alias typeset enable shopt

(无需尝试启动新的 shell,这在受限制的 shell 中可能是不允许的。)

相关内容