10 комбінацій для повторного використання команд
Копіювати й передруковувати команди ніби й не займає так багато часу ― всього лиш 5 секунд. Але якщо ви робите це десятки разів на день, то втрачаєте години. Є щонайменше 10 перевірених прийомів, якими сисадміни скорочують цю рутину всього лиш до кількох кліків.
Щойно ви розберетесь, як працюють конструкції на кшталт !!, !$ чи !*, історія Bash перестане бути просто списком старих команд і перетвориться на зручний інструмент без постійного проклацування стрілками.
У цьому матеріалі зібрали ці комбінації з короткими прикладами, щоб ви змогли застосувати їх одразу й відчути різницю у швидкості роботи.
1. sudo !! — перезапустити останню команду з правами root
Замість того щоб шукати попередню команду через нескінченне натискання стрілки вгору, можна просто використати sudo !!
Ця комбінація повторно запускає останню команду, але вже з правами root. Особливо корисно для встановлення пакетів, роботи із системними файлами чи керування службами.
Наприклад, якщо ви щойно виконали apt install htop то після введення sudo !! Bash фактично перетворить це на sudo apt install htop.
Перевага цього підходу в тому, що !! звертається до останньої команди з історії та підставляє її ще до початку виконання.
На що звернути увагу
Якщо ж замість цього ви бачите помилку sudo: !!: command not found найімовірніше, ви працюєте не в Bash або запускаєте команду всередині неінтерактивної оболонки на кшталт sh. Функція !!працює саме в Bash, а в zsh схожі механізми поводяться трохи інакше.
Перевірити свою оболонку можна командою:
echo $SHELL
2. !$ — підставити останній аргумент
Уявімо, що ви, наприклад, створили каталог:
mkdir -p /etc/myapp/config
А тепер хочете одразу перейти до нього:
cd !$
Bash автоматично підставить останній аргумент із попередньої команди, тож фактично виконається команда:
cd /etc/myapp/config
У результаті ви створюєте каталог і миттєво переходите в нього без повторного введення вручну.
Той самий підхід зручний і в інших повсякденних сценаріях. Наприклад, ви відкрили конфігураційний файл:
vim /etc/ssh/sshd_config
Після редагування хочете швидко перевірити його права доступу:
ls -l !$
Bash знову підставить останній аргумент:
ls -l /etc/ssh/sshd_config
На що звернути увагу
Одна з найчастіших плутанин — різниця між !$ та $_. Обидві конструкції звертаються до останнього аргументу попередньої команди, але працюють по-різному.
- !$ — це частина механізму історії Bash і працює лише в інтерактивному терміналі.
- $_ — змінна оболонки, яка також доступна в скриптах.
Для швидкої роботи в терміналі можна використовувати будь-який варіант. Але якщо пишете shell-скрипт — краще обирати $_.
3. !* — підставити усі аргументи
Якщо !$ підставляє лише останній аргумент із попередньої команди, то !* повертає одразу весь список параметрів. Це особливо зручно, коли ви вже працювали з кількома файлами й хочете оперативно виконати над ними ще одну дію
Наприклад, ви змінили права доступу для кількох файлів:
chmod 644 report.txt notes.txt config.yaml
А тепер хочете перевірити їхні права та власників:
ls -l !*
Bash автоматично підставить усі аргументи з попередньої команди, тож фактично буде виконано:
ls -l report.txt notes.txt config.yaml
Це зручно, коли не хочеться заново вводити довгий список файлів або ризикувати випадковою помилкою під час ручного копіювання назв.
На що звернути увагу
!* механічно повторює всі аргументи з попередньої команди — включно з помилками. Тобто якщо в назві файлу був typo, Bash так само повторно його підставить. Тому навіть із такими скороченнями варто перевіряти, що саме ви запускаєте, перш ніж натиснути Enter.
4. ^old^new — виправити помилку без стрілок
Цю можливість Bash використовують не так часто, але щойно звикаєш, вона стає чи не найулюбленішою функцією.
Конструкція ^old^new дозволяє повторно виконати останню команду, автоматично замінивши в ній один фрагмент тексту на інший. Рятує в моменти, коли ви надрукували довгу команду з помилкою й не хочете заново рухати курсор або переписувати весь рядок.
Наприклад, ви випадково написали:
systemctl restart ngnix
І отримали у відповідь:
Failed to restart ngnix.service: Unit ngnix.service not found.
Проблема тут у звичайному typo: правильна назва сервісу — nginx, а не ngnix.
Замість повторного введення всієї команди достатньо виконати:
^ngnix^nginx
systemctl restart nginx
На що звернути увагу
Варто пам’ятати, що така підстановка змінює лише перше входження тексту. Якщо помилка повторюється в команді кілька разів — Bash виправить тільки першу.
Для глобальної заміни можна використати складніший варіант:
!!:gs/old/new
Але в реальній роботі його використовують значно рідше.
Якщо ж Bash відповідає помилкою на кшталт substitution failed це означає, що він не знайшов текст, який ви намагались замінити, у попередній команді. У такому випадку варто перевірити написання ще раз — включно з пробілами та регістром символів.
5. !number — виконати команду з історії за номером
Bash зазвичай зберігає історію всіх виконаних команд і присвоює кожній із них власний номер. Завдяки цьому ви можете повторно запускати старі команди без копіювання, прокручування історії чи повторного введення вручну.
Щоб переглянути список, достатньо ввести команду:
history
Ви побачите приблизно такий журнал:
498 df -h
499 lsblk
500 mount /dev/sdb1 /mnt/data
501 ls /mnt/data
502 umount /mnt/data
503 history
Тепер, якщо потрібно ще раз виконати команду під номером 500, достатньо ввести:
!500
Bash автоматично підставить потрібну команду:
mount /dev/sdb1 /mnt/data
Перед запуском оболонка покаже розгорнуту версію, тож у вас буде кілька секунд, щоб помітити можливу помилку. Це зручно, коли потрібно повторно виконати довгу команду find, rsync або щось інше з початку сесії без нескінченного прокручування історії термінала.
На що звернути увагу
Повторний запуск старих команд за номером безпечний для перевірок або читання даних, проте може бути ризикованим для деструктивних операцій на кшталт rm, dd чи mkfs. Bash виконає те, що ви попросили (навіть якщо це погана ідея).
6. !string — повторити останню команду
Якщо пам’ятаєте хоча б початок потрібної команди, шукати її номер в історії не обов’язково. Bash дозволяє миттєво повторно виконати останню команду, яка починалася з певного слова. Для цього достатньо ввести знак !, а після нього — початок команди, наприклад !mount
Вивід:
mount /dev/sdb1 /mnt/data
У цьому випадку інтерпретатор перегляне історію команд, знайде найсвіжіший запис, що починається з mount, і відразу його запустить. Незамінна комбінація, якщо команда виконувалась нещодавно, а передруковувати її або шукати через history не хочеться.
На що звернути увагу
Якщо за час роботи ви виконали кілька схожих команд, можна випадково запустити не ту, яку очікували. Тому спершу перевірте результат пошуку, скориставшись модифікатором :p.
!mount:p
Вивід:
mount /dev/sdb1 /mnt/data
У цьому режимі Bash лише покаже знайдену команду в терміналі, але не запускатиме її. Маленький чек, який врятує від зайвих сюрпризів.
7. Ctrl+R — зворотній пошук в історії команд
Комбінація Ctrl+R запускає зворотний пошук в історії команд. Це один із найзручніших способів знайти та повторно використати команду, яку ви виконували раніше, але вже не пам’ятаєте повністю.
Після натискання Ctrl+R у терміналі з’явиться запит:
(reverse-i-search)\':`
Тепер почніть вводити будь-яку частину потрібної команди. Наприклад:
(reverse-i-search)\rsync': rsync -avz --progress /home/ravi/ backup@192.168.1.10:/backups/`
Bash миттєво почне шукати збіги в історії та показуватиме результати в режимі реального часу.
Коли потрібну команду знайдено, ви можете:
- натиснути Enter, щоб одразу виконати її;
- натиснути Ctrl+R ще раз, щоб перейти до старішого збігу;
- натиснути → (стрілку вправо), щоб перенести команду в рядок введення та відредагувати її перед запуском.
Якщо з’явиться повідомлення:
(failed reverse-i-search)
Це означає, що в історії не знайдено команд, які містять введений фрагмент. У такому випадку спробуйте скоротити пошуковий запит або використати іншу частину команди.
На що звернути увагу
Якщо ви часто працюєте в терміналі, варто збільшити розмір історії команд у файлі .bashrc:
HISTSIZE=10000
HISTFILESIZE=20000
Тоді Bash зберігатиме більше записів, а пошук через Ctrl+R стане ще кориснішим.
8. Alt+. (Esc+.) — повторно використати аргументи з історії команд
Alt+. дозволяє миттєво вставити останній аргумент попередньої команди. Особливо допомагає, коли потрібно повторно використати довгий шлях до файлу чи каталогу, не вводячи його вручну.
Наприклад, ви виконали команду:
tar -czf backup.tar.gz /home/ravi/documents
Тепер введіть нову команду та натисніть Alt+.:
ls -lh /home/ravi/documents
Bash автоматично підставить останній аргумент із попередньої команди — у цьому випадку шлях /home/ravi/documents.
На цьому можливості комбінації не закінчуються. Якщо натиснути Alt+. ще раз, Bash підставить останній аргумент уже з попередньої команди в історії. Таким чином можна швидко переглядати й використовувати аргументи з раніше виконаних команд, не відкриваючи історію та не копіюючи їх вручну.
По суті, Alt+. виконує те саме завдання, що й конструкція !$, але в інтерактивному режимі. Ви одразу бачите, який аргумент буде вставлено, і за потреби можете відредагувати його перед запуском команди.
Вона працює в Bash із підтримкою Readline, тобто доступна практично в усіх сучасних дистрибутивах Linux. Після кількох днів роботи з Alt+. повернення до ручного введення починає здаватися зайвою тратою часу.
9. fc — відредагувати і повторно виконати попередню команду
Назва fc розшифровується як fix command (виправити команду). Ця комбінація відкриває останню виконану команду в текстовому редакторі, визначеному змінною $EDITOR, дозволяючи внести зміни перед повторним запуском.
Після виконання fc відкриється редактор (наприклад, vim, nano або інший налаштований у вашій системі) з уже завантаженою останньою командою з історії. Відредагуйте її, збережіть зміни та закрийте редактор — Bash типово виконає оновлену версію.
Це особливо корисно для довгих або складних команд, коли швидкі заміни на кшталт ^old^new вже не надто зручні.
fc також може відкривати для редагування кілька команд із історії одночасно:
fc 498 501
У редакторі з’явиться список команд із зазначеного діапазону:
df -h
lsblk
mount /dev/sdb1 /mnt/data
ls /mnt/data
Після редагування та збереження Bash виконає їх послідовно. Такий підхід зручний, коли потрібно переглянути серію команд, підкоригувати їх або швидко перетворити послідовність дій на готовий сценарій.
На що звернути увагу
Якщо змінна $EDITOR не налаштована, у більшості систем fc використовуватиме редактор vi. За потреби можна вказати бажаний редактор у файлі ~/.bashrc:
export EDITOR=vim
10. HISTCONTROL — усунути дублікати в історії Bash
Звичайно, це не найшвидший прийом у Bash, але один із найкорисніших для довготривалої роботи. Правильно налаштований HISTCONTROL допомагає зберігати історію команд чистішою, позбавляє її зайвих повторів і значно спрощує пошук потрібних записів.
Додайте до файлу ~/.bashrc такий рядок:
HISTCONTROL=ignoreboth
Параметр HISTCONTROL підтримує кілька режимів:
- ignoredups — не зберігає команду в історії, якщо вона повністю збігається з попередньою. Це допомагає уникнути десятків однакових записів після повторних запусків тієї самої команди.
- ignorespace — ігнорує команди, які починаються з пробілу. Зручно для одноразових команд або тих, які не варто залишати в історії.
- ignoreboth — поєднує можливості обох режимів і є найпопулярнішим варіантом налаштування.
Після внесення змін застосуйте нову конфігурацію:
source ~/.bashrc
Якщо команда виконується без повідомлень, налаштування застосовано успішно. У разі появи помилки перевірте доданий рядок на наявність друкарських помилок або зайвих символів.
Хоча це налаштування займає лише кілька секунд, воно робить роботу з історією Bash значно комфортнішою та допомагає швидше знаходити потрібні команди навіть через тривалий час.
Замість висновків
Як бачите, можливості історії Bash не обмежуються лише командою sudo !!.
Опанувавши лише кілька прийомів роботи з історією Bash, можна помітно пришвидшити взаємодію з терміналом. Звісно, не обов’язково запам’ятовувати всі комбінації одразу. Почніть з однієї-двох, які найкраще відповідають вашому сценарію роботи.
Ці команди допоможуть працювати швидше, а наш курс Linux для новачків — зрозуміти, чому вони працюють саме так.
Пам’ятайте, що невеликі оптимізації економлять секунди на кожній команді та години в довгостроковій перспективі.