Разверните переменную оболочки при редактировании командной строки

На ум приходят два варианта печати удаляемого файла:

find /tmp -type f -mmin +100 -printf '%p was deleted!!\n' -delete

или

find /tmp -type f -mmin +100 -exec rm -v {} \;

Первый предписывает GNU findнапечатать имя файла (полностью -с указанием пути )перед его удалением; последний указывает findвыполнять rm -vдля каждого имени файла, где -vуказывает (GNU)rmподробно рассказывать о том, что он делает.

Вывод первого будет похож на:

/tmp/.sh_history.6668 was deleted!!
/tmp/krb5cc_6094 was deleted!!
/tmp/.sh_history.18394 was deleted!!

В то время как вывод последнего будет:

removed ‘/tmp/.sh_history.6668’
removed ‘/tmp/krb5cc_6094’
removed ‘/tmp/.sh_history.18394’

Еще один момент, который следует отметить при сравнении -exec rm {}и -delete, заключается в том, что -exec rmбудет искать в $PATH rm, а-deleteнапрямую удаляет файл. Обычно это не проблема, но о чем нужно знать.

Пример:

$ pwd
/tmp/jeff
$ ls
bar  foo  rm
$ cat rm
#!/bin/sh
echo Hi, I am the fake rm: "$@"
$ PATH=/tmp/jeff:$PATH
$ find. -type f -exec rm {} \;
Hi, I am the fake rm:./rm
Hi, I am the fake rm:./bar
Hi, I am the fake rm:./foo

С помощью -deletefindтакже будет проходить путь поиска в глубину -первым способом по умолчанию. Это позволяет ему удалять каталоги, в которые он позже не будет пытаться войти. Вам придется использовать findс -depth, если вы используете -exec rm -rf {}для каталогов, иначе вы заставите findжаловаться на то, что не нашли каталоги, которые, по его мнению, были там.

0
14.12.2020, 11:42
1 ответ

Вы можете вызвать функцию Readline shell-expand-line, нажав Meta + Ctrl+e(в моей системе Meta равно Esc ), если оболочка bashнаходится в режиме редактирования Emacs.

Иллюстрация:

$ echo $PATH

Если я сейчас нажму Meta + Ctrl+e , оболочка заменит всю строку на

$ echo /usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin

Это также расширит подстановки команд и, следовательно, потенциально выполнит части командной строки, необходимые для выполнения подстановки. Это также означает, что незаконченные вещи, такие как $(, вызовут синтаксическую ошибку.

Это не расширяет шаблоны подстановки оболочки.

Если вы хотите использовать это в режиме редактирования Vi , вам нужно явно привязать функцию shell-expand-lineк последовательности клавиш, поскольку по умолчанию она не привязана. Например, чтобы привязать его к Ctrl+e , используйте

bind '"\C-e": shell-expand-line'

Использование той же последовательности клавиш, что и в режиме Emacs, очевидно, будет проблематичным, поскольку Esc имеет специальную функцию в режиме Vi.

4
18.03.2021, 22:43

Теги

Похожие вопросы