Як використовувати команду history в Linux

Оболонка Linux зберігає історію команд, які ви запускаєте, і ви можете шукати в ній, щоб повторити команди, які ви виконували в минулому. Як тільки ви зрозумієте команду історії Linux і як її використовувати, це може значно підвищити вашу продуктивність.

Маніпулювання Історією

Як Відомо сказав Джордж Сантаяна, «Ті, хто не може пам’ятати минулого, приречені його повторювати». На жаль, у Linux, якщо ви не можете згадати минуле, ви не можете повторити його, навіть якщо захочете.

Ось тоді стане в нагоді команда історії Linux. Це дозволяє переглядати та повторювати попередні команди. Це не просто заохочувати лінь чи заощадити час — тут також діє фактор ефективності (і точності). Чим довша та складніша команда, тим важче її запам’ятати та ввести без помилки. Є два типи помилок: одна, яка перешкоджає роботі команди, і друга, яка дозволяє команді працювати, але змушує її робити щось несподіване.

Команда history усуває ці проблеми. Як і більшість команд Linux, це більше, ніж ви думаєте. Однак, якщо ви навчитеся використовувати команду history, це може покращити використання командного рядка Linux щодня. Це гарне вкладення вашого часу. Є набагато кращі способи використання команди історії, ніж просто натискання стрілки вгору кілька разів.

Команда історії

У найпростішій формі ви можете використовувати команду history, просто ввівши її назву:

history

The

Потім у вікно терміналу записується список раніше використаних команд.

Приклад виходу з

Команди пронумеровані, а останні використані (з найбільшими номерами) в кінці списку.

Щоб побачити певну кількість команд, ви можете передати номер в історію в командному рядку. Наприклад, щоб побачити останні 10 команд, які ви використовували, введіть наступне:

history 10

The

Ви можете досягти того ж результату, якщо проведіть історію через команда хвоста. Для цього введіть наступне:

history | tail -n 10

The

Повторення команд

Якщо ви хочете повторно використати команду зі списку історії, введіть знак оклику (!) і номер команди без пробілів між ними.

Наприклад, щоб повторити команду номер 37, ви повинні ввести цю команду:

!37

An

Щоб повторити останню команду, введіть два знаки оклику, знову ж таки, без пробілів:

!!

An

Це може бути корисно, коли ви вводите команду і забуваєте використовувати sudo. Введіть sudo, один пробіл, подвійні знаки оклику, а потім натисніть Enter.

Для наступного прикладу ми ввели команду, яка вимагає sudo. Замість того, щоб повторно вводити весь рядок, ми можемо зберегти купу натискань клавіш і просто ввести sudo !!, як показано нижче:

mv ./my_script.sh /usr/local/bin/
sudo !!

An

Таким чином, ви можете ввести відповідне число зі списку, щоб повторити команду, або використовувати подвійні знаки оклику, щоб повторити останню команду, яку ви використовували. Однак що робити, якщо ви хочете повторити п’яту чи восьму команду?

Ви можете використовувати один знак оклику, дефіс (-) і номер будь-якої попередньої команди (знову ж таки, без пробілів), щоб повторити її.

  Отримуйте корисні нагадування на робочому столі Linux за допомогою Stretchly

Щоб повторити 13-ту попередню команду, ви повинні ввести наступне:

!-13

An

Пошук команд за рядком

Щоб повторити останню команду, яка починається з певного рядка, ви можете ввести знак оклику, а потім рядок без пробілів, а потім натиснути Enter.

Наприклад, щоб повторити останню команду, яка починалася з sudo, ви повинні ввести цю команду:

!sudo

An

Але в цьому є елемент небезпеки. Якщо остання команда, яка розпочалася з sudo, не та, яку ви думаєте, ви запустите неправильну команду.

Однак для забезпечення безпеки ви можете використовувати модифікатор :p (друк), як показано нижче:

!sudo:p

An

Це наказує історії надрукувати команду у вікні терміналу, а не виконувати її. Це дозволяє вам побачити команду перед її використанням. Якщо вам потрібна команда, натисніть стрілку вгору, а потім натисніть Enter, щоб використати її.

Якщо ви хочете знайти команду, яка містить певний рядок, ви можете використовувати знак оклику та знак питання.

Наприклад, щоб знайти та виконати першу відповідну команду, яка містить слово «псевдонім», ви повинні ввести цю команду:

!?aliases

An

Це дозволить знайти будь-яку команду, яка містить «псевдоніми» рядка, незалежно від того, де вона з’являється в рядку.

Інтерактивний пошук

Інтерактивний пошук дозволяє переглядати список відповідних команд і повторювати потрібну.

Просто натисніть Ctrl+r, щоб почати пошук.

Після цього вікно терміналу

Коли ви введете підказку пошуку, з’явиться перша відповідна команда. Літери, які ви вводите, з’являються між крапкою (`) і апострофом (‘). Відповідні команди оновлюються під час введення кожної літери.

А

Кожного разу, коли ви натискаєте Ctrl+r, ви шукаєте назад наступну відповідну команду, яка з’являється у вікні терміналу.

А

Коли ви натискаєте Enter, відображена команда буде виконана.

The

Щоб відредагувати команду перед її виконанням, натисніть клавішу зі стрілкою вліво або вправо.

А

Команда з’явиться в командному рядку, і її можна редагувати.

Ви можете використовувати інші інструменти Linux для пошуку в списку історії. Наприклад, щоб передати вихідні дані з історії в grep і пошук команд, які містять рядок «псевдоніми», ви можете використовувати цю команду:

history | grep aliases

The

Змінення останньої команди

Якщо вам потрібно виправити друкарську помилку, а потім повторити команду, ви можете використовувати курсор (^), щоб змінити її. Це чудовий трюк, щоб мати в рукаві, коли ви написали команду з помилкою або хочете повторно запустити її з іншим параметром або параметром командного рядка.

Щоб використовувати його, введіть (без пробілів) курсор, текст, який потрібно замінити, іншу вказівку, текст, яким потрібно замінити її, іншу каретку, а потім натисніть клавішу Enter.

Наприклад, припустимо, що ви вводите таку команду, випадково ввівши «shhd» замість «sshd»:

sudo systemctl start shhd

Ви можете легко виправити це, ввівши наступне:

^shhd^sshd^

А

Команда виконується з «shhd», виправленим на «sshd».

Видалення команд зі списку історії

Ви також можете видалити команди зі списку історії за допомогою параметра -d (видалити). Немає причин зберігати вашу команду з помилкою в списку історії.

Ви можете використовувати grep, щоб знайти його, передати його номер в історію за допомогою параметра -d, щоб видалити його, а потім знову здійснити пошук, щоб переконатися, що його немає:

history | grep shhd
history -d 83
history | grep shhd

The

Ви також можете передати діапазон команд параметру -d. Щоб видалити всі записи списку від 22 до 32 (включно), введіть цю команду:

history -d 22 32

Щоб видалити лише останні п’ять команд, ви можете ввести від’ємне число, наприклад:

history -d -5

Оновлення файлу історії вручну

Коли ви входите в систему або відкриваєте сеанс термінала, список історії зчитується з файлу історії. У Bash файлом історії за замовчуванням є .bash_history.

  Як відновити втрачені дані в Linux

Будь-які зміни, які ви вносите під час поточного сеансу вікна терміналу, записуються до файлу історії лише тоді, коли ви закриваєте вікно терміналу або виходите з системи.

Припустимо, ви хочете відкрити інше вікно терміналу, щоб отримати доступ до повного списку історії, включаючи команди, які ви ввели в першому вікні терміналу. Параметр -a (усі) дозволяє зробити це в першому вікні терміналу, перш ніж відкрити друге.

Щоб скористатися ним, введіть наступне:

history -a

The

Команди безшумно записуються у файл історії.

Якщо ви хочете записати всі зміни списку історії до файлу історії (якщо ви видалили деякі старі команди, наприклад), ви можете використовувати параметр -w (запис), наприклад:

history -w

The

Очищення списку історії

Щоб очистити всі команди зі списку історії, ви можете використовувати параметр -c (очистити), як показано нижче:

history -c

Якщо ви також хочете примусово внести ці зміни до файлу історії, використовуйте параметр -w, наприклад:

history -w

Безпека та файл історії

Якщо ви використовуєте будь-які програми, які вимагають введення конфіденційної інформації (наприклад, паролів) у командному рядку, пам’ятайте, що це також буде збережено у файлі історії. Якщо ви не хочете, щоб певна інформація зберігалася, ви можете використати таку структуру команд, щоб негайно видалити її зі списку історії:

special-app my-secret-password;history -d $(history 1)
history 5

А

Ця структура містить дві команди, розділені крапкою з комою (;). Давайте розберемо це:

special-app: назва програми, яку ми використовуємо.
my-secret-password: секретний пароль, який ми повинні надати для програми в командному рядку. Це кінець першої команди.
history -d: У команді два ми викликаємо параметр -d (видалити) історії. Те, що ми збираємося видалити, знаходиться в наступній частині команди.
$(історія 1): тут використовується підстановка команди. Частина команди, що міститься в $(), виконується у підоболонці. Результат цього виконання публікується як текст у вихідній команді. Команда history 1 повертає попередню команду. Отже, ви можете думати про другу команду як історію -d «остання команда тут».

Ви можете використовувати команду history 5, щоб переконатися, що команда, що містить пароль, була видалена зі списку історії.

Однак є ще простіший спосіб зробити це. Оскільки Bash ігнорує рядки, які за замовчуванням починаються з пробілу, просто додайте пробіл на початку рядка, як показано нижче:

 special-app another-password
history 5

А

Команда з паролем не додається до списку історії. Причина, чому цей трюк працює, міститься у файлі .bashrc.

Файл .bashrc

Файл .bashrc виконується щоразу, коли ви входите в систему або відкриваєте вікно терміналу. Він також містить деякі значення, які контролюють поведінку команди історії. Давайте відредагуємо цей файл за допомогою gedit.

  Як змінити налаштування DNS в Linux

Введіть наступне:

gedit .bashrc

The

У верхній частині файлу ви побачите два записи:

HISTSIZE: максимальна кількість записів, які може містити список історії.
HISTFILESIZE: обмеження на кількість рядків, які може містити файл історії.

Ці два значення взаємодіють наступним чином:

Коли ви входите в систему або починаєте сеанс вікна терміналу, список історії заповнюється з файлу .bash_history.
Коли ви закриваєте вікно терміналу, максимальна кількість команд, встановлених у HISTSIZE, зберігається у файлі .bash_history.
Якщо параметр оболонки histappend увімкнено, команди додаються до .bash_history. Якщо histappend не встановлено, .bash_history перезаписується.
Після збереження команд зі списку історії в .bash_history файл історії обрізається, щоб містити не більше ніж HISTFILESIZE рядків.

Також у верхній частині файлу ви побачите запис для значення HISTCONTROL.

The

Ви можете встановити це значення, щоб виконувати будь-які з наступних дій:

ignorespaces: рядки, які починаються з пробілу, не додаються до списку історії.
ignoredups: повторювані команди не додаються до файлу історії.
ignoreboth: Вмикає обидва з вищезазначених.

Ви також можете вказати певні команди, які не хочете додавати до списку історії. Розділіть їх двокрапкою (:) і візьміть їх у лапки (“…”).

Ви повинні дотримуватися цієї структури, щоб додати рядок до вашого файлу .bashrc і замінити команди, які ви хочете ігнорувати:

export HISTIGNORE="ls:history"

An

Використання міток часу

Якщо ви хочете додати позначки часу до списку історії, ви можете використовувати параметр HISTIMEFORMAT. Для цього ви просто додайте рядок, подібний до наведеного нижче, до вашого файлу .bashrc:

export HISTTIMEFORMAT="%c "

Зверніть увагу, що перед закриваючими лапками є пробіл. Це запобігає збігу позначки часу з командами у списку команд.

An

Тепер, коли ви запускаєте команду history, ви бачите позначки дати та часу. Зауважте, що будь-які команди, які були в списку історії до того, як ви додали позначки часу, будуть мати мітку часу разом із датою та часом першої команди, яка отримує мітку часу. У цьому прикладі, показаному нижче, це була команда 118.

Це дуже довга мітка часу. Однак ви можете використовувати інші маркери, ніж %c, щоб уточнити його. Інші токени, які ви можете використовувати:

%d: день
%m: місяць
%y: Рік
%H: година
%M: Хвилини
%S: секунди
%F: повна дата (формат рік-місяць-дата)
%T: час (формат години:хвилини:секунди)
%c: повна дата та час (формати день-дата-місяць-рік та години:хвилини:секунди)

Давайте поекспериментуємо та використаємо кілька різних токенів:

export HISTTIMEFORMAT="%d n%m %T "

Експорт HISTTIMEFORMAT=

Вихідні дані використовують день, місяць і час.

Однак, якщо ми вилучимо день і місяць, він просто покаже час.

Будь-які зміни, внесені в HISTIMEFORMAT, застосовуються до всього списку історії. Це можливо, оскільки час для кожної команди зберігається як кількість секунд з епохи Unix. Директива HISTTIMEFORMAT просто вказує формат, який використовується для відтворення цієї кількості секунд у зручний для читання стиль, наприклад:

export HISTTIMEFORMAT="%T "

The

Наші результати тепер більш керовані.

Ви також можете використовувати команду history для аудиту. Іноді перегляд команд, які ви використовували в минулому, може допомогти вам визначити, що могло спричинити проблему.

Як і в житті, у Linux ви можете використовувати команду history, щоб знову пережити хороші часи та вчитися на поганих.