Как я могу предотвратить выполнение bash 'rm', когда ' * ' является одним из аргументов?
Я хочу застраховать себя от случайного использования
rm [argument_i] * [argument_j]
то есть он всегда должен отказаться от выполнения команды, когда символ звездочки разделен пробелом с обеих сторон, независимо от того, что еще до или после звездочки.
Какую команду я должен добавить к моей .bashrc
включить такую проверку?
Спасибо за любые подсказки.
2 ответа
Я думаю, что вам лучше определить псевдоним для rm, поэтому всякий раз, когда вы выполняете rm, это будет не сам rm, а ваш псевдоним.
В этом псевдониме вы можете разобрать все.
alias rm='/my/path/myrm.sh'
И этот скрипт может иметь все параметры разбора, которые вы хотите.
Этот псевдоним должен быть помещен в.bashrc /.bash_profile или даже в / etc / profile, если вы хотите, чтобы он применялся ко всем пользователям.
Редактировать Следующие комментарии ниже, я добавил оболочку, которая отключает * интерпретируется как список всех файлов, и становится просто строкой.
alias rm='set -f; /bin/sh /home/me/test/rm.sh'
Сценарий может начаться так:
#!/bin/sh
if echo "$2" | grep '*' > /dev/null; then
echo "asterisk!"
else
echo "hi this is $var1 and $var2 and $var3"
fi
Тестовое задание:
$ rm a * b
asterisk!
Как я предложил в другом вопросе, использование ловушки DEBUG, которая проверяет BASH_COMMAND, поможет:
check_for_wildcard_rm() {
local rm_glob_re='^rm[[:space:]](.*[[:space:]])?[*]([[:space:]]|$)'
if [[ $BASH_COMMAND =~ $rm_glob_re ]]; then
echo "Suppressing rm with a bare *" >&2
return 1
fi
return 0
}
shopt -s extdebug
trap check_for_wildcard_rm DEBUG