Есть ли способ заблокировать rm
с одним *
в производственных серверах? Это поможет предотвратить такие несчастные случаи, как:
rm test *
вместо того
rm test*
Вот функция bash, которая может быть получена из .bashrc, чтобы добавить предупреждение, когда вы используете rm с более чем двумя аргументами:
unalias rm 2>/dev/null
real_rm=/bin/rm
rm_opts=""
function confirm {
echo -n "Do you want to continue (Y/N)? "
read v
v=$(echo $v|tr '[a-z]' '[A-Z]')
if [[ "$v" == "Y" ]]; then
return 0
elif [[ "$v" == "N" ]]; then
return 1
else
confirm
fi
}
function rm {
if [ $# -gt 2 ]; then
echo "WARNING: You have passed a list of files and directories that is $# entries long! Is this what you intended?"
echo "Here is the list of files:"
echo "$@"
confirm
if [ $? -eq 0 ]; then
$real_rm $rm_opts $@
fi
else
$real_rm $rm_opts $@
fi
}
Не обошлось и без замены корпуса. rm
даже не видеть то *
поскольку оболочка объединяет соответствующие имена файлов перед их передачей в rm
.
Не решение, а небольшой обходной путь. Псевдоним rm
так как rm -i
.
Этот обходной путь не помогает при использовании флага -f.
Используйте zsh - он автоматически спросит вас, хотите ли вы удалить все файлы в каталоге.
server:~/dir/processing> rm *
zsh: sure you want to delete all the files in /home/wheel/dja/dir/processing [yn]?
(Я предполагаю, что это функция по умолчанию - я не могу найти какие-либо параметры конфигурации, которые были установлены для ее включения, но я не писал свой .zshrc)
Вы также можете указать специальный псевдоним, который вместо этого может использовать пользователь, который вас беспокоит. например
alias rm-test="rm test*"
Опять же, это скорее работа, но в целом * nix предполагает, что вы знаете, что делаете, и собираетесь делать то, что говорите.