8 случаев использования оператора (!) в командах Linux
Большинство следующих команд Linux, использующих символ ‘!’, могут отличаться в разных оболочках.
Хотя приведенные мной примеры обычно используются в оболочке bash, некоторые другие оболочки Linux могут иметь другую реализацию или вообще не поддерживать определенные варианты использования символа ‘!’.
Давайте погрузимся в удивительные и загадочные случаи использования символа или оператора ‘!’ в командах Linux.
1. Запуск команды из истории с помощью номеров команд
Возможно, вы не знаете о том, что можно запустить команду из истории команд (уже/раньше выполненных команд).
Для начала найдите номер команды, выполнив команду ‘history’.
$ history
Чтобы запустить команду из истории по ее номеру, можно использовать символ ‘!’, за которым следует номер команды, как показано далее:
!1551

Когда вы выполните приведенную выше команду, будет запущена команда с номером строки 1551 из вашей истории команд.
Обратите внимание, что фактический номер команды может отличаться в зависимости от истории команд.
Вы можете использовать команду history для просмотра списка команд вместе с их номерами строк.
2. Запуск ранее выполненных команд в Linux
Вы можете запустить те команды, которые выполнялись ранее, по их последовательности выполнения.
Последняя выполненная команда будет представлена как -1, вторая последняя как -2, седьмая последняя как -7 и так далее.
Например, если вы хотите повторно запустить команду, которая была выполнена шесть, восемь или десять команд назад, вы можете использовать команду !-n, где n – количество команд назад, к которым вы хотите обратиться.
history !-6 !-8 !-10
3. Передача аргументов предыдущей команды новой команде
Мне нужно перечислить содержимое каталога ‘/home/$USER/Binary/firefox’, поэтому я выполнил команду.
ls /home/$USER/Binary/firefox
Затем я понял, что мне нужно было набрать ‘ls -l’, чтобы посмотреть, какой файл является исполняемым.
Так должен ли я набрать всю команду снова? Нет, мне это не нужно.
Мне просто нужно перенести последний аргумент в эту новую команду как:
ls -l !$
Здесь !$ переносит аргументы, переданные в последней команде, в эту новую команду.
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”
Обратите внимание, что первый аргумент может быть выведен как “!^”, а остальные аргументы могут быть выведены путем выполнения команды “![Name_of_Command]:[Number_of_argument]”
В приведенном выше примере первой командой была ‘cp’, а для вывода требовался 2-й аргумент.
Отсюда “!cp:2”, если какая-либо команда говорит, что xyz выполняется с 5 аргументами и вам нужно получить 4-й аргумент, вы можете использовать “!xyz:4”, и использовать его по своему усмотрению.
Ко всем аргументам можно получить доступ с помощью “!*”.
5. Выполнение последних команд на основе определенных ключевых слов
Мы можем выполнить последние выполненные команды на основе ключевых слов.
Это можно понять следующим образом:
ls /home > /dev/null [Команда 1] ls -l /home/avi/Deskto
Здесь мы использовали команду ls, но с разными переключателями и для разных папок.
Кроме того, мы отправили вывод каждой команды в ‘/dev/null’, чтобы сохранить консоль чистой.
Теперь выполните последние запущенные команды на основе ключевых слов.
! ls [Команда 1] ! ls -l [Команда 2] ! ls -la [Команда 3] ! ls -lA [Ко
Проверьте вывод и вы будете поражены тем, что вы запускаете уже выполненные команды, просто используя ключевое слово ls.
6. Повторение последней выполненной команды в Linux
Вы можете запустить/изменить последнюю выполненную команду с помощью оператора (!!), который представляет собой сокращенное обозначение, позволяющее ссылаться на предыдущую выполненную команду в командной строке.
Например, в прошлый день я запустил однострочный скрипт, чтобы узнать IP-адрес машины Linux.
ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1
Затем я вдруг понял, что мне нужно перенаправить вывод вышеуказанного скрипта в файл ip.txt, так что же мне делать?
Должен ли я снова набрать всю команду и перенаправить вывод в файл?
Простое решение – использовать навигационную клавишу UP и добавить ‘> ip.txt’, чтобы перенаправить вывод в файл.
ip addr
Теперь рассмотрим следующее условие, когда я в следующий раз запущу приведенный ниже однострочный скрипт.
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
7. Удаление файлов за исключением одного файла с помощью оператора ‘!’
В Linux оператор ! (известный как оператор “bang”) используется для расширения истории, что позволяет обращаться к предыдущим командам в истории команд и выполнять с ними различные операции.
Чтобы удалить все файлы из каталога, кроме определенного файла (important_file.txt), вы можете использовать команду rm с оператором !, как показано ниже.
rm !(important_file.txt)
Удалить из папки все типы файлов, кроме тех, расширение которых ‘.pdf’.
$ rm !(*.pdf)
8. Проверка существования каталога в Linux
Здесь мы будем использовать ‘! -d’ для проверки существования или отсутствия каталога, за которым следует оператор логического И (&&) для вывода несуществующего каталога и оператор логического ИЛИ (||) для вывода существующего каталога.
Логика такова, что если результат [ ! -d /home/avi/Tecmint ] равен 0, то будет выполняться то, что лежит за пределами логического И, в противном случае перейдем к логическому ИЛИ (||) и выполним то, что лежит за пределами логического ИЛИ.
[ ! -d /home/avi/itsec] && printf '\nno such /home/avi/itsec directory exist\n' || printf '\n/home/avi/
Аналогично условию выше, но здесь, если нужный каталог не существует, команда завершится.
[ ! -d /home/avi/itsec ] && exit
Общая реализация на языке cкриптов , при которой, если нужный каталог не существует, он создаст его.
[ ! -d /home/avi/itsec ] && mkdir /home/avi/itsec