覆盖与系统命令同名的用户定义函数


14

此功能存在于我的用户的〜/ .bashrc中:

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

在需要用户运行的ksh脚本中,我有这样一行:

[[ "$KEEP" = "" ]] && \rm $FILE

虽然反斜杠转义了用户定义的别名,但是它不会阻止脚本运行具有相同名称的用户定义函数。结果,调用了我用户的rm()函数,而不是系统函数。

我发现了这个超级用户的问题和答案,但是解决方案仅适用于内置函数,而不适用于系统命令。

什么是最好的方法来执行rm命令而不是别名或函数?我是否必须指定rm的完整路径,并确保要正确执行的每个系统命令?有没有更好的办法?

Answers:


13

您可以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

谢谢,“命令”正是我想要的。但是似乎必须对每个执行的系统命令都使用。我想确保您正在运行system命令的唯一肯定的方法是指定整个路径。但是,使用这种方法时,您会在不同发行版的相同路径中使用命令。
acm 2012年

@acm正如我所写,您也可以走这env条路线。此外,您可以一次确定每个工具的位置,并将其存储在变量中,例如RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;。您还可以更改脚本的执行方式。通常,函数和别名不会被继承,否则它们会一直破坏脚本。
丹尼尔·贝克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.