10 удивительных вариаций использования символа (!) в командах Linux

Новости

Символ «!» в Linux можно использовать в качестве оператора логического отрицания, а также для извлечения команд из истории с помощью настроек или для запуска ранее выполняемой команды с модификацией. Все приведенные ниже команды были проверены в оболочке bash. Давайте рассмотрим использование «!» символа в командах Linux.

 

1. Запуск команды из истории по номеру команды.

Возможно, вы не знаете, что вы можете выполнить команду из своей истории уже выполненных команд. Чтобы начать работу, сначала найдите номер команды, запустив команду «history».

$ history

 

history

 

history-running

 

 

Теперь запустите команду из истории по номеру в выводе истории, которому она была выполнена ранее. Скажем, запустите команду, которая была выполнена под номером 1551 в выводе команды «history».

$ !1551

 

history-1551

 

history-top

 

Команда приведённая выше выполнит команду top, которая была указана под номером 1551. Способ который мы показали для получения уже выполненной команды из истории очень полезен в случае выполнении длинных команд. Вам просто нужно вызывать их с помощью «![Номер, в котором она появляется в выводе команды history]».

2. Запуск ранее выполненной команды (предпоследней команды, седьмой с конца команды и т.д.)

Вы можете запускать те команды, которые вы выполняли ранее в обратной последовательности выполнения, последняя команда запуска будет представлена ​​как -1, вторая — как -2, седьмая — как -7, ….

Сначала запустите команду history, чтобы получить список последних выполненных команд. Необходимо запустить команду history, чтобы вы могли убедится, что в списке недавно выполненных команд нет «опасных» команд, таких как rm command > file, чтобы убедиться, что вы случайно не удалите важные системные файлы.

$ history
$ !-6
$ !-8
$ !-10

 

history

 

history-running

 

Run-Last-Executed-Commands-By-Numbers

3. Перенос аргументов последней выполненной команды, в новую команду без повторного набора

Допустим необходимо просмотреть содержимое каталога ‘/home/$USER/Binary/firefox’, для этого выполним:

$ ls /home/$USER/Binary/firefox

 

A что делать чтобы посмотреть, какой файл там был исполняемый? Необходимо было запустить ‘ls -l‘.  Теперь необходимо снова вводить всю команду?! Нет, нам это не нужно. Мы просто перенесём значения аргумента последней команды в новую:

$ ls -l !$

 

Здесь !$ переносит аргументы, выполненные последней командой в новую.

Pass-Arguments-of-Last-Executed-Command-to-New

 

Pass-Arguments-of-Last-Executed-Command-to-New-running

 

4. Как обрабатывать два или более аргумента с помощью «!»

Предположим, мы создал текстовый файл 1.txt на рабочем столе.

$ touch /home/avi/Desktop/1.txt

 

А затем скопировали его в ‘/home/avi/Downloads‘, используя полный путь с помощью команды cp.

$ cp /home/avi/Desktop/1.txt /home/avi/downloads

 

Мы передали два аргумента с помощью команды cp. Сначала «/home/avi/Desktop/1.txt», а второй — «/home/avi/Downloads». Давайте попробуем передать их по отдельности, просто выполните echo [arguments], чтобы набрать оба аргумента отдельно.

$ echo “1st Argument is : !^”
$ echo “2nd Argument is : !cp:2”

 

Примечание. 1-й аргумент можно напечатать как «!^», а остальные аргументы можно напечатать, выполнив «![Name_of_Command]:[Number_of_argument]».

В приведенном выше примере первая команда была «cp», и для её корректного выполнения был необходим второй аргумент. Следовательно чтобы его получить вы можете использовать, «!cp:2». Если какая-либо команда, к примеру, «xyz» запускается с 5-ю аргументами, и вам нужно получить 4-й аргумент, вы можете использовать «!xyz:4» и использовать его по своему усмотрению. Доступ к всем аргументам можно получить с помощью «!*».

Handle-Two-or-More-Arguments

 

 

5. Как выполнить одну из последних выполненных команд используя ключевые слова

Мы можем выполнить одну из последних выполненных команд используя ключевые слова. Чтобы понять что это значит давайте обратимся к следующему примеру:

$ ls /home > /dev/null [Command 1]
$ ls -l /home/avi/Desktop > /dev/null [Command 2]
$ ls -la /home/avi/Downloads > /dev/null [Command 3]
$ ls -lA /usr/bin > /dev/null [Command 4]

 

Здесь мы использовали ту же команду (ls), но с разными ключевыми словами и для разных папок. Более того, мы отправили вывод каждой команды в «/dev/null», так как мы не собираемся обрабатывать вывод команды, и оставляем вывод консоли чистым.

Теперь выполните одну из последних выполненных команд используя ключевые слова:

$ ! ls [Command 1]
$ ! ls -l [Command 2]
$ ! ls -la [Command 3]
$ ! ls -lA [Command 4]

 

Проверьте вывод, и вы будете удивлены… Вы выполните ранее приведенные команды используя только ключевые слова около команды ls.

Run-Commands-Based-on-Keywords

 

 

6. Сила оператора «!!»

Вы можете запустить/изменить свою последнюю выполненную команду, используя «!!». Оператор «!!» будет вызывать последнюю выполненную команду используя корректировки из текущей команды. Давайте разберёмся по подробнее.

Вчера я запускал однострочный скрипт, чтобы получить свой IP-адрес:

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/

 

Затем я понял, что мне нужно перенаправить вывод вышеупомянутого скрипта в файл ip.txt, так что же мне делать? Не уж то мне необходимо снова ввести всю команду и перенаправить вывод в файл? Хорошим решением является использование клавиши навигации UP (иными словами стрелочки вверх на клавиатуре) и добавление «> ip.txt» для перенаправления вывода в файл:

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt

 

 

Действительно всё сработало хорошо благодаря клавише UP. Теперь рассмотрим следующее условие:

$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

 

 

Как только мы запустим скрипт, подсказка bash вернёт ошибку с сообщением «bash: ifconfig: command not found». Не сложно догадаться, что мы запускаем команду как обычный пользователь, а необходимо выполнять её как root.

Так в чём же проблема? Трудно войти в систему как root, а затем снова ввести всю команду?! Кроме того, уже не получиться как в последнем примере использовать клавишу UP. Так что же делать? Нам нужно использовать «!!» (без кавычек), чтобы вызвать последнюю выполненную команду:

$ su -c “!!” root

 

 

Здесь su сделает нас пользователем root, -c — запустит определенную команду как пользователь, и самая важная часть «!!» будет заменена командой которая запускалась последней. И да, Вам необходимо указать пароль root.

The-Power-of-!!-Key

 

 

Рекомендуем использовать «!!» главным образом в следующих сценариях:

1. Когда запускаете команду apt-get как обычный пользователь, и получаете сообщение об ошибке, когда у вас нет разрешения на выполнение.

$ apt-get upgrade && apt-get dist-upgrade

 

 

Появится ошибка, не беспокойтесь, выполните команду приведенную ниже, чтобы всё исправить:

$ su -c !!

 

Точно так же, как и при выполнении следующих команд:

$ service apache2 start

 

или

$ /etc/init.d/apache2 start

 

или

$ systemctl start apache2

 

Текущий пользователь не имеет права выполнять такие ​​задачи, поэтому запускаем…

$ su -c 'service apache2 start'

 

или

$ su -c '/etc/init.d/apache2 start'

 

или

$ su -c 'systemctl start apache2'

 

7. Запуск команды, которая повлияет на весь файл, кроме ![FILE_NAME]

«!» (логическое НЕТ) можно использовать для запуска команды для всех файлов/расширений, за исключением «![ИМЯ_ФАЙЛА]».

1. Удалим все файлы из каталога, кроме файла с именем 2.txt.

$ rm !(2.txt)

 

 

2. Удалим все файлы из папки, кроме тех, которые с расширением «pdf».

$ $ rm !(*.pdf)

 

 

8. Проверка, существования каталога (например, /home/avi/sedicomm)?

Здесь мы будем использовать ‘! -d ‘, чтобы проверить, существует ли каталог и так же будем использовать «Логическое И» (Оператор «&&»), чтобы вывести что этот каталог не существует, и «Логическое ИЛИ» (Оператор «||») для вывода каталога.

Всё просто, когда вывод [! -d /home/avi/sedicomm] равен 0, команда выполнит то, что лежит за пределами логического И, то есть перейдет к логическому ИЛИ.

$ [ ! -d /home/avi/sedicomm] && printf '\nno such /home/avi/sedicomm directory exist\n' || printf '\n/home/avi/sedicomm directory exist\n'

 

9. Проверка существования каталога? Не выходя из команды.

Все подобно приведенному выше примеру, но здесь, если нужный каталог не существует, команда завершит своё выполнение.

$ [ ! -d /home/avi/sedicomm] && exit

 

10. Создание каталога (например, test) в своем домашнем каталоге, если он не существует.

Ниже приведена общая реализация на языке сценариев. Где, если нужная директория будет создана только если она не существовала до этого.

[ ! -d /home/avi/sedicomm] && mkdir /home/avi/sedicomm

 

 

Спасибо за уделенное время на прочтение статьи!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco от Академии Ciscoкурсы Linux от Linux Professional Institute на платформе SEDICOMM University.

Курсы Cisco и Linux с трудоустройством!

Спешите подать заявку! Осталось пару мест. Группы стартуют 22 июля, а следующая 19 августа, 23 сентября, 21 октября, 25 ноября, 16 декабря, 20 января, 24 февраля.
Что Вы получите?
  • Поможем стать экспертом в сетевом администрировании и получить международные сертификаты Cisco CCNA Routing & Switching или Linux LPI.
  • Предлагаем проверенную программу и учебник экспертов из Cisco Networking Academy и Linux Professional Institute, сертифицированных инструкторов и личного куратора.
  • Поможем с трудоустройством и сделать карьеру. 100% наших выпускников трудоустраиваются.
Как проходит обучение?
  • Проводим вечерние онлайн-лекции на нашей платформе или обучайтесь очно на базе Киевского офиса.
  • Спросим у вас об удобном времени для практик и подстроимся: понимаем, что времени учиться мало.
  • Если хотите индивидуальный график — обсудим и осуществим.
  • Выставим четкие дедлайны для самоорганизации. Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
А еще поможем Вам:
  • отредактировать резюме;
  • подготовиться к техническим интервью;
  • подготовиться к конкурсу на понравившуюся вакансию;
  • устроим на работу в Cisco по программе Cisco Incubator, New Graduate и Experienced. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco CCNA Routing & Switching и Linux LPI, подайте заявку или получите бесплатную консультацию.
Новости

Больше похожих постов

1 комментарий. Оставить новый

  • Странная ситуация с приведённым вами седьмым способом использования ! «…Запуск команды, которая повлияет на весь файл, кроме !…». Приведённый вами способ работает только для команды rm. С командой ls ( ls !(*.jpg) ) получается совершенно другой результат — в результате ls выдает результат, как будто его вызывали с ключом -R, и при этом неважно, что находится в скобках, может быть и (*.zip), (*.html), (*.doc). Почему так ? Операционка — ubuntu 12.04
    Ответить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Most Viewed Posts
Меню