🐉 8 загадочных случаев использования оператора (!) в командах Linux |

🐉 8 загадочных случаев использования оператора (!) в командах Linux

Мануал

Символ или оператор ‘!’ на 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/Desktop > /dev/null [Команда 2]
ls -la /home/avi/Downloads > /dev/null         [Команда 3]
ls -lA /usr/bin > /dev/null [Команда 4]

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

Кроме того, мы отправили вывод каждой команды в ‘/dev/null’, чтобы сохранить консоль чистой.

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

! ls [Команда 1]
! ls -l [Команда 2]
! ls -la [Команда 3]
! ls -lA [Команда 4]

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

6. Повторение последней выполненной команды в Linux

Вы можете запустить/изменить последнюю выполненную команду с помощью оператора (!!), который представляет собой сокращенное обозначение, позволяющее ссылаться на предыдущую выполненную команду в командной строке.

Например, в прошлый день я запустил однострочный скрипт, чтобы узнать IP-адрес машины Linux.

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

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

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/itsec directory exist\n'

Аналогично условию выше, но здесь, если нужный каталог не существует, команда завершится.

[ ! -d /home/avi/itsec ] && exit

Общая реализация на языке cкриптов , при которой, если нужный каталог не существует, он создаст его.

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

На этом пока все.

Если вы знаете или сталкивались с каким-либо другим использованием ‘!’, о котором стоит знать, вы можете высказать свое предложение в обратной связи.

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий