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

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





Report Page