![覆盖与系统命令同名的用户定义函数](https://linux22.com/image/1329440/%E8%A6%86%E7%9B%96%E4%B8%8E%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4%E5%90%8C%E5%90%8D%E7%9A%84%E7%94%A8%E6%88%B7%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0.png)
此函数存在于我的一个用户的 ~/.bashrc 中:
function rm()
{
ls $*
echo "rm?"
read ans
if [ "$ans" == 'y' ]; then
/bin/rm $*
fi
}
在我需要用户运行的 ksh 脚本中,有一行这样的代码:
[[ "$KEEP" = "" ]] && \rm $FILE
虽然反斜杠可以转义用户定义的别名,但它不会阻止脚本运行具有相同名称的用户定义函数。因此,调用的是用户的 rm() 函数,而不是系统函数。
我发现这超级用户问题问答,但解决方案仅适用于内置函数,而不是系统命令。
强制调用 rm 命令而不是别名或函数的最佳方法是什么?我必须指定 rm 的完整路径以及我想要确保正确执行的每个系统命令吗?还有更好的方法吗?
答案1
您可以使用command
它来绕过正常的 bash 函数查找。
command rm
非破坏性示例:
$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which
或者,使用 来调用它env
(在 上执行具有给定名称的第一个程序$PATH
,或者通过指定完整路径)。
/usr/bin/env rm
/bin/rm