З BASH після "прокрутки" до попередньої команди ... як потім перейти до наступної в цій історії?


59

Вибачте, ця назва не найвишуканіша, яку я коли-небудь придумав.

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

Коли я кажу «прокрутка» вгору, я маю на увазі використання клавіші «стрілка вгору» на клавіатурі, яка, очевидно, прокручує вас вгору через історію, починаючи з останньої команди.

Отже, ти знайдеш команду, можливо, 30 команд назад ... і ти її запустиш. І тоді ви хочете запустити команду, яка спочатку прийшла після неї ... чи є такий спритний спосіб зробити це? Або як це роблять ті, хто вільно говорить БАШ?

Відповіді:


96

Запустивши команду з Ctrl+ oзамість Enter, запустіть команду з історії, а потім чергуйте наступну, замість того, щоб повернутися до фронту історії bash.


2
Я просто спробував це у власному баші, що працює в xterm на NetBSD, і він не працює! Чи є налаштування, які можуть впливати на це? У мене немає файлу .inputrc. Co не згадується на сторінці посібника для читання рядків (3).
Ріалто

@Rhialto Чи використовуєте ви viредагування рядків (увімкнено set -o vi) або emacs? Тому Ctrl-Oщо, наскільки я можу, не буде працювати з колишнім.
B Layer

... але це може бути виправлено за допомогою команди: bind "\C-o":operate-and-get-next(або додати всі після того, як bindдо ~/.inputrc)
B Шар

1
Я з'ясував, у чому полягає моя проблема: ^ O приймається символом Flush Output (не підтримується в Linux), і readline не відключає це, поки він активний. Я поставив простий патч, але підтримка bash та readline стверджує, що це не помилка. Я не погоджуюсь. Див. List.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto

19

Відповідь Джона Райнгольда чудова, але я запропонував набагато більш потужне рішення. У мене також є коментар щодо гатчі у відповіді Джона, але у мене недостатньо репутації, щоб можна було коментувати безпосередньо, тому @Jon Reinhold, якщо ви прочитаєте це, будь ласка, зверніться до мого коментаря до вас нижче.

Bash включає команду fc, яка приймає в якості номерів рядків параметрів списку історії bash. Потім він відкриває ваш редактор за замовчуванням з такими рядками як текст. У цей момент ви можете необов’язково редагувати рядки. Потім, виходячи з редактора, bash виконує ці рядки!

Приклад редагування, яке ви хочете зробити, - це додавання до всіх, крім останнього рядка, на кшталт "; read -p" next ... ". Це призведе до того, що bash буде виконувати кожен рядок, і підкаже перед продовженням.

Коментар до Джона Райнгольда: Чудова відповідь, але ви повинні кваліфікувати його, тому що якщо користувач встановив змінну bash HISTCONTROL, щоб включити erasedups, то після виконання C-oкористувач буде замішаний , оскільки замість очікуваної наступної команди в історії відображається, наступна після цього буде показано. Це тому, що bash видалив початковий екземпляр виконаної команди, і, отже, всі команди згодом змістилися вгору на один рядок, тобто. до одного нижчого номера індексу в списку історії.


дякую, намагаючись знайти відповідь шляхом пошуку, я натрапив на команду "fc". Для мене це представляє собою наступний етап у повільних кроках немовляти БАШ по шляху слави до ЗНАНЬ. Я хотіла першого кроку дитини.
мійський гризун

3
@mikerodent Ні . Так що це відбувається fcще до як Ctl-oі bashсам. (Всупереч цій відповіді вона також менш корисна.)
kubanczyk

1
Проблема з erasedupsявно помилковою помилкою ( могла бути передбачена така ситуація). Хоча добре знати, хоча.
alexis

2
@kubanczyk Це до дискусій. Якщо це складна, складна команда, залежно від того, що потребує виправлення, мені буде набагато швидше використовувати мій редактор, що вибирається, для оновлення команди. Так само було б простіше.
Прифтан

14

Ще один спосіб досягти бажаної поведінки - це ознайомлення з ярликами bash readline (з яких я вважаю CTRL- oце я вважаю) та пошуком історії пошуку.

Пошук історії

CTRL- rпереведе вас до пошуку історії команд bash, де ви можете почати вводити шукану команду, і bash автоматично заповнить команду для вас. Функціональність автозаповнення дійсно дуже гарна. Коли команда, яку потрібно виконати, знаходиться у рядку введення, ви можете ENTERзапустити команду або натиснути CTRL- eдля переміщення курсору до кінця командного рядка та виходу з режиму пошуку історії.

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

Пошук історії є дуже потужним і чудовим способом уникнути використання стрілки вгору, щоб повернутися до команди в першу чергу. Швидкий пошук історії може заощадити багато часу вручну на пошуках історії, а потім ви можете продовжувати CTRL- oяк Джон вказував вище.

Прочитайте короткі скорочення

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

  1. CTRL- nдля наступної команди (еквівалент стрілки вниз)
  2. CTRL- pдля попередньої команди (еквівалент стрілки вгору)
  3. CTRL- bповернення символу (еквівалент лівої стрілки)
  4. CTRL- fпереслати символ (еквівалент стрілки праворуч)

Ці ярлики для читання рядків (разом із CTRL- aпочатком рядка та CTRL- eкінцем рядка) збільшать вашу швидкість та ефективність у командному рядку imo.


2
Не знаю. Я вважаю, що використання модифікаторних клавіш відбувається повільніше, ніж стрілки або будь-яке інше натискання однієї клавіші. Що стосується EOL / тощо. Я схильний використовувати домашні / кінцеві клавіші (stty -a, звичайно, показує і деякі дуже зручні речі).
Прифтан

@ Прифтан Досить справедливо, останнє речення подається як думка (див. "Іммо"). Я вважаю, що перебування на домашньому ряду клавіатури на тривалій відстані - це хороша стратегія для роботи в терміналі чи будь-яких інших завдань, що інтенсивно набирають текст. У деяких людей є клавіатури, де клавіші зі стрілками ближче до інших символів, у цьому випадку, можливо, ярлики для читання рядків не є переконливою зручністю. Я відредагую відповідь, щоб зробити останній пункт більш чітким твердженням думки.
111 ---

1
@datUser Tbh ​​Я пропустив 'imo' (або якщо я цього не зробив, я нехтував розглядати це - цілком можливо). Що правда, хоча зворотний пошук корисний (мати +1), якщо він працює для вас. Звичайно, fc - це теж щось (як уже зазначалося), і так використовується! (тощо). Безліч способів скинути кішку в Юнікс. Що стосується клавіатур, це теж правда: у мене є клавіатура Unicomp (люблю це і повертає спогади), але, звичайно, є й інші клавіатури, які слід враховувати, не кажучи вже про Дворак. Зрештою, чим більше варіантів у вас є, тим краще ви перебуваєте і простіше працювати (або грати) :)
Прифтан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.