it-swarm-ru.tech

Понимание восклицательного знака (!) В bash

Я использовал

history | less

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

!22

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

112
Vass

! - это функция, которая изначально появилась в C Shell , в те времена, когда можно было рассчитывать, что на терминалах есть клавиши со стрелками. Это особенно полезно, если вы добавляете текущий номер команды в подсказку (PS1="\!$ ") чтобы вы могли быстро взглянуть на экран, чтобы получить числа для прошлых команд.

Теперь, когда вы можете использовать клавиши со стрелками и такие вещи, как Ctrl-R для поиска в истории команд я не вижу особой пользы для этой функции.

Один из вариантов, который вы все еще можете найти полезным, это !!, который повторно выполняет предыдущую команду. Сам по себе я не нахожу !!Enter чуть быстрее, чем просто Enter, но это может быть полезно, когда объединено в большую команду.

Пример: Распространенные ошибка пилота на Sudo системах на основе забыть префикс Sudo для команды, которая требует дополнительных привилегий. Новичок перепечатывает всю команду. Прилежный ученик редактирует команду из истории команд Shell. Просветленный типа Sudo !!.

Bash позволяет отключить ! обработка в командной консоли с помощью set +o histexpand или set +H. Вы можете отключить его в Zsh с помощью set -K.

157
Warren Young

Если здесь нет более длинного ответа, то, конечно, есть один, посвященный Super User, поскольку я недавно его прочитал. В страница руководства bash вы можете найти огромный раздел, озаглавленный РАСШИРЕНИЕ ИСТОРИИ по этому вопросу.

Вы можете сделать целый хост больше, чем просто запустить последнюю команду или команду номер X. Вы можете делать такие вещи, как !cat, чтобы выполнить последнюю команду, которая началась с cat. Или !?bash?:s/bash/csh/ запускает последнюю команду, содержащую bash, но заменяет ее на csh.

52
Cry Havok

Многое можно сделать с помощью ! такие как:

  • выполнить команду, набранную до 3 команд: !-3
  • выполнить команду, которая начинается с !ls

и многое другое. Смотрите 15 примеров расширения Linux Bash History, которые вы должны знать

40
user379997

Конечно, вы можете сделать !! для повторного использования последней команды в bash Shell. И тогда есть !$, чтобы повторно использовать последнюю часть вашей последней команды.

например просмотреть какой-нибудь файл

less path/to/your/file.txt

Если вы хотите отредактировать тот же файл, вы можете использовать !$ чтобы получить только путь к файлу из последней команды

vim !$

Правка:

Вы можете использовать все аргументы предыдущей команды с !*

например: это создаст несколько файлов и удалит их все

$ touch a.txt b.txt c.txt d.txt
$ rm !*

Опять же, вы можете использовать определенный аргумент предыдущей команды

например Это создаст 4 файла и удалит 3-й файл (c.txt)

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

Точно так же вы можете использовать диапазон аргументов из последней команды следующим образом

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

Это будет повторно использовать аргументы 2-4, которые оценивают выражение как rm b.txt c.txt d.txt

6
Teshan Shanuka J

Мой друг написал мне по электронной почте это:

Это часть GNU истории библиотеки. В bash она используется для повторного запуска команд в вашей истории. Если вы хотите быть хардкорным, grep для history_expansion_char в bash-4.1/lib/readline/histexpand .c для деталей реализации.

4
Vass