переопределення визначених користувачем функцій з тим самим іменем, що і системні команди


14

Ця функція існує в ~ / .bashrc мого користувача:

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

У моєму скрипті ksh, який потрібно запустити користувачам, у мене є такий рядок:

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

Поки зворотна косої риски уникає визначених користувачем псевдонімів, це не зупиняє сценарій запускати визначені користувачем функції з тим самим іменем. Як результат, функція rm () мого користувача викликається замість системної функції.

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

Що найкраще застосовувати команду rm від виклику, а не псевдоніму чи функції? Потрібно вказати повний шлях до rm та кожну системну команду, яку я хочу переконатися, виконана правильно? Чи є кращий спосіб?

Відповіді:


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

дякую, "команда" - це саме те, що я шукаю. Здається, начебто тупим потрібно використовувати для кожної виконуваної системної команди. Я здогадуюсь, єдиний впевнений спосіб запускати, щоб переконатися, що ви виконуєте системну команду, - це вказати весь шлях. Тим не менш, ви бачите команди, які перебувають у тому ж шляху через різні дистрибутиви при такому підході.
acm

@acm Як я вже писав, ви також можете піти envмаршрутом. Крім того, ви можете визначити місце кожного інструменту один раз і зберегти його в змінній, наприклад RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Ви також можете змінити спосіб виконання сценарію. Зазвичай функції та псевдоніми не успадковуються, інакше вони весь час порушують сценарії.
Даніель Бек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.