考虑到恶劣的环境,例如:
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模式:
- 函数名称可能与 POSIX 特殊内置函数之一不同。
- 在命令查找期间,在 shell 函数之前找到 POSIX 特殊内置函数。
由于set
和unset
是特殊的内置函数,您可以通过 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 中可能是不允许的。)