Символ или оператор ‘!’ на Linux может использоваться как оператор логического отрицания, а также для извлечения команд из истории с изменениями или для запуска ранее выполненных команд с изменениями.
Большинство следующих команд Linux, использующих символ ‘!’, могут отличаться в разных оболочках.
Хотя приведенные мной примеры обычно используются в оболочке bash, некоторые другие оболочки Linux могут иметь другую реализацию или вообще не поддерживать определенные варианты использования символа ‘!’.
Давайте погрузимся в удивительные и загадочные случаи использования символа или оператора ‘!’ в командах Linux.
- 1. Запуск команды из истории с помощью номеров команд
- 2. Запуск ранее выполненных команд в Linux
- 3. Передача аргументов предыдущей команды новой команде
- 4. Как обрабатывать два или более аргументов в командах
- 5. Выполнение последних команд на основе определенных ключевых слов
- 6. Повторение последней выполненной команды в Linux
- 7. Удаление файлов за исключением одного файла с помощью оператора ‘!’
- 8. Проверка существования каталога в Linux
1. Запуск команды из истории с помощью номеров команд
Возможно, вы не знаете о том, что можно запустить команду из истории команд (уже/раньше выполненных команд).
Для начала найдите номер команды, выполнив команду ‘history’.
Чтобы запустить команду из истории по ее номеру, можно использовать символ ‘!’, за которым следует номер команды, как показано далее:
Когда вы выполните приведенную выше команду, будет запущена команда с номером строки 1551 из вашей истории команд.
Обратите внимание, что фактический номер команды может отличаться в зависимости от истории команд.
Вы можете использовать команду history для просмотра списка команд вместе с их номерами строк.
2. Запуск ранее выполненных команд в Linux
Вы можете запустить те команды, которые выполнялись ранее, по их последовательности выполнения.
Последняя выполненная команда будет представлена как -1, вторая последняя как -2, седьмая последняя как -7 и так далее.
Например, если вы хотите повторно запустить команду, которая была выполнена шесть, восемь или десять команд назад, вы можете использовать команду !-n, где n – количество команд назад, к которым вы хотите обратиться.
3. Передача аргументов предыдущей команды новой команде
Мне нужно перечислить содержимое каталога ‘/home/$USER/Binary/firefox’, поэтому я выполнил команду.
Затем я понял, что мне нужно было набрать ‘ls -l’, чтобы посмотреть, какой файл является исполняемым.
Так должен ли я набрать всю команду снова? Нет, мне это не нужно.
Мне просто нужно перенести последний аргумент в эту новую команду как:
Здесь !$ переносит аргументы, переданные в последней команде, в эту новую команду.
4. Как обрабатывать два или более аргументов в командах
Допустим, я создал на рабочем столе текстовый файл 1.txt.
а затем скопируйте его в ‘/home/avi/Downloads’, используя полный путь с обеих сторон с помощью команды cp.
Теперь мы передали два аргумента команде cp.
Первый – ‘/home/avi/Desktop/1.txt’, а второй – ‘/home/avi/Downloads’, давайте обработаем их по-разному, просто выполните echo [arguments], чтобы вывести оба аргумента по-разному.
Обратите внимание, что первый аргумент может быть выведен как “!^”, а остальные аргументы могут быть выведены путем выполнения команды “![Name_of_Command]:[Number_of_argument]”
В приведенном выше примере первой командой была ‘cp’, а для вывода требовался 2-й аргумент.
Отсюда “!cp:2”, если какая-либо команда говорит, что xyz выполняется с 5 аргументами и вам нужно получить 4-й аргумент, вы можете использовать “!xyz:4”, и использовать его по своему усмотрению.
Ко всем аргументам можно получить доступ с помощью “!*”.
5. Выполнение последних команд на основе определенных ключевых слов
Мы можем выполнить последние выполненные команды на основе ключевых слов.
Это можно понять следующим образом:
Здесь мы использовали команду ls, но с разными переключателями и для разных папок.
Кроме того, мы отправили вывод каждой команды в ‘/dev/null’, чтобы сохранить консоль чистой.
Теперь выполните последние запущенные команды на основе ключевых слов.
Проверьте вывод и вы будете поражены тем, что вы запускаете уже выполненные команды, просто используя ключевое слово ls.
6. Повторение последней выполненной команды в Linux
Вы можете запустить/изменить последнюю выполненную команду с помощью оператора (!!), который представляет собой сокращенное обозначение, позволяющее ссылаться на предыдущую выполненную команду в командной строке.
Например, в прошлый день я запустил однострочный скрипт, чтобы узнать IP-адрес машины Linux.
Затем я вдруг понял, что мне нужно перенаправить вывод вышеуказанного скрипта в файл ip.txt, так что же мне делать?
Должен ли я снова набрать всю команду и перенаправить вывод в файл?
Простое решение – использовать навигационную клавишу UP и добавить ‘> ip.txt’, чтобы перенаправить вывод в файл.
Теперь рассмотрим следующее условие, когда я в следующий раз запущу приведенный ниже однострочный скрипт.
Как только я запустил скрипт, приглашение bash выдало ошибку с сообщением “bash: ifconfig: command not found”, мне не составило труда догадаться, что я запускаю эту команду от имени пользователя, где она должна быть запущена от имени root.
Так какое же решение?
Трудно заходить в систему под именем root, а затем набрать всю команду снова!
Также (навигационная клавиша UP) в последнем примере не пришла на помощь здесь.
Итак? Нам нужно вызвать “!!!” без кавычек, что вызовет последнюю команду для этого пользователя.
7. Удаление файлов за исключением одного файла с помощью оператора ‘!’
В Linux оператор ! (известный как оператор “bang”) используется для расширения истории, что позволяет обращаться к предыдущим командам в истории команд и выполнять с ними различные операции.
Чтобы удалить все файлы из каталога, кроме определенного файла (important_file.txt), вы можете использовать команду rm с оператором !, как показано ниже.
Удалить из папки все типы файлов, кроме тех, расширение которых ‘.pdf’.
8. Проверка существования каталога в Linux
Здесь мы будем использовать ‘! -d’ для проверки существования или отсутствия каталога, за которым следует оператор логического И (&&) для вывода несуществующего каталога и оператор логического ИЛИ (||) для вывода существующего каталога.
Логика такова, что если результат [ ! -d /home/avi/Tecmint ] равен 0, то будет выполняться то, что лежит за пределами логического И, в противном случае перейдем к логическому ИЛИ (||) и выполним то, что лежит за пределами логического ИЛИ.
Аналогично условию выше, но здесь, если нужный каталог не существует, команда завершится.
Общая реализация на языке cкриптов , при которой, если нужный каталог не существует, он создаст его.
На этом пока все.
Если вы знаете или сталкивались с каким-либо другим использованием ‘!’, о котором стоит знать, вы можете высказать свое предложение в обратной связи.
см. также:
- 🐧 Linux: Разница между /dev/tty, /dev/tty0 и /dev/console
- 🖧 Команда Linux для выхода из SSH-соединения
- 🔐 Как настроить файл htaccess в Apache на CentOS/RHEL
- 🖧 Основные номера сетевых портов на Linux
- 📜 Как узнать, откуда был скачан файл в командной строке Linux