Могу ли я использовать `rm` только при использовании globbing? (либо в bash, либо в zsh, либо в обоих)

Всякий раз, когда я rm несколько элементов с чередованием оболочки, и есть даже малейшая вероятность, что шаблон расширяется до большего, чем я ожидаю, я всегда стараюсь не забывать добавлять -i , но (конечно) я мог забыть и случайно сдуть что-то полезное. Некоторые люди пытаются решить эту проблему с помощью псевдонима, например alias rm='rm -i' но я ненавижу идею сделать rm всегда интерактивным, потому что тогда я привык использовать -f все время, которое очевидно, победит всю цель.

То, что я хотел бы сделать, это заставить rm использовать только -i когда я использую globbing, и, конечно, для переопределения -i , поэтому я все еще могу сдуть целые каталоги с помощью обычного rm -rf junk .

Следовательно, rm *blah* действительно будет rm -i *blah* но rm blah будет работать точно так же, как набирается.

В случае, если есть разница в том, как это может быть выполнено в разных оболочках, я выберу ответ, который поставляет методы для ответов bash и zsh, которые покрывают только один или другой.


Примечание . На самом деле я не уверен, что это обязательно хорошая идея; Я просто спрашиваю, возможно ли это. Если вы считаете, что это глупая идея, я был бы очень рад услышать аргументы вашего мнения, но, пожалуйста, не оставляйте такие комментарии в поле ответа . Реальные ответы либо говорят мне, как это сделать, либо объясняют это / почему это невозможно (или, возможно, предлагают альтернативный метод получения аналогичного результата). Но если вы хотите сказать мне, почему это глупо, напишите как комментарий. Я выскажу аргументированные комментарии, даже если не соглашусь с выводом.

2 Solutions collect form web for “Могу ли я использовать `rm` только при использовании globbing? (либо в bash, либо в zsh, либо в обоих)”

Это не легко. Проблема в том, что когда вы делаете:

 rm -- *.txt 

rm просто видит список файлов, а не шаблон globbing, который уже был расширен оболочкой.

Что вы можете сделать, это (zsh):

 alias rm='noglob rm' 

Это говорит zsh, что шаблоны не должны расширяться при вызове rm. Затем вы можете переопределить rm как функцию, которая сама расширяет, и добавляет «-i», если это необходимо:

 'rm'() { [[ "$*" = *[*[?]* ]] && set -- -i "$@" command rm $~@ } 

Проблема с этим подходом заключается в том, что этот новый «rm» не видит разницы между

 rm * 

а также

 rm '*' 

Чтобы удалить файл с именем * , вам нужно написать его:

 rm [*] 

Работает в bash, возможно, в других оболочках. Место в вашем .bashrc

 function rm() { while test "${1:0:1}" = "-"; do shift done if test $# -eq 1; then command rm "$1" else command rm -i "$@" fi } 
  • Ошибка перехвата «команда не найдена» в zsh
  • Zsh: dirs в обратном порядке
  • очистка вывода скрипта, так что он спускается, дает имена пакетов и чисто
  • Вставка имеет нечетное поведение в оболочке
  • zsh завершение: меню и однозначный префикс с одной вкладкой?
  • Поиск в обратном и прямом направлениях осуществляется с помощью vi-режима в zsh
  • Расширить vi-режим до irb, postgres и т. Д. В zsh
  • Предопределенная umask по заданному пути
  • Чтение из tty в трубчатой ​​оболочке
  • Как можно настроить псевдонимы bash для обработки пробелов в именах каталогов?
  • Изменение оболочки по умолчанию без привилегий chsh или администратора
  • Linux и Unix - лучшая ОС в мире.