Как я могу предотвратить выполнение 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
Другие вопросы по тегам