переопределение пользовательских функций с тем же именем, что и системные команды

14

Эта функция существует в одном из моих пользователей ~ / .bashrc:

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

В моем сценарии ksh, который требуется запускать пользователям, у меня есть такая строка:

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

Хотя обратная косая черта экранирует пользовательские псевдонимы, она не мешает сценарию запускать пользовательские функции с тем же именем. В результате моя системная функция rm () вызывается вместо системной функции.

Я нашел этот вопрос и ответ суперпользователя, но разрешение относится только к встроенной функции, а не к системной команде.

Как лучше всего принудительно вызывать команду rm, а не псевдоним или функцию? Должен ли я указать полный путь к rm, и каждая системная команда, которую я хочу гарантировать, выполняется правильно? Есть ли способ лучше?

ACM
источник

Ответы:

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
Даниэль Бек
источник
спасибо, "команда" это именно то, что я ищу. Кажется, это глупо использовать для каждой выполняемой системной команды. Я предполагаю, что единственный надежный способ убедиться, что вы запускаете системную команду, это указать весь путь. Однако при таком подходе вы полагаетесь на команды, находящиеся на одном и том же пути в разных дистрибутивах.
2012 года
@acm Как я уже писал, вы также можете пойти по этому envпути. Кроме того, вы можете определить местоположение каждого инструмента один раз и сохранить его в переменной, например RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Вы также можете изменить способ выполнения сценария. Обычно функции и псевдонимы не наследуются, иначе они будут постоянно нарушать работу сценариев.
Даниэль Бек