Як я можу ефективно переміщуватися по командному рядку bash?


19

Тому я використовую upв своїй оболонці (здебільшого Bash на OSX або Ubuntu), але деякий час я знаю, що мені потрібні речі після поточного розташування курсору. Чи є спосіб, щоб лінія, на якій я перебуваю, завершена з лінією вище? Ударup а потім leftдратує.

Будь-які інші хитрощі теж були б крутими, крім tab , про які ми зараз всі :)

Ось приклад (за запитом ~ quack):

Я набираю, mkdir /where/the/hell/is/that/thingа потім хочу ввести компакт-диск у ту саму каталог. Але тепер я знаю про мета-б :)


1
явний приклад був би приголомшливим.
квакш кіхот

@ ~ quack робить приклад зараз
Dan Rosenstark

1
ось споріднене (дубльоване) запитання з цілком приємною відповіддю: superuser.com/questions/124336/…
cregox

Відповіді:


11

Спробуйте це:

mkdir /where/the/hell/is/that/thing

потім натисніть alt+.

залежно від вашої ОС та терміналу, можливо, вам доведеться набрати esc тоді.

Ви також можете натиснути alt+ 1+, .щоб вибрати певний попередній аргумент.

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

редагувати: строго кажучи, це metaне altтак, тому воно може також працювати з клавішею "windows" залежно від налаштування вашої клавіатури.


цікаво! не знав про це.
квакш-кіхот

2
@justin це приголомшливо. На OSX мета - це втеча.
Дан Розенстарк

@yar з терміналом OS X також є параметр налаштувань у розділі "Налаштування" -> "Клавіатура", щоб "використовувати опцію як мета-клавішу".
ThomasW

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

28

Вам слід прочитати man bash у вашій системі, особливо розділ Readline , оскільки це інтерактивний механізм введення bash. Посібник Bash на gnu.org має чудовий розділ про редагування командних рядків який допоможе заповнити деякі прогалини.

За замовчуванням ви можете використовувати їх для переміщення по командному рядку (лише перелічивши декілька тут; див. Посилання для повного списку):

  • Ctrl+ aпереходить до початку рядка (або Homeзалежно від налаштувань терміналу)
  • Ctrl+ eпереміщується до кінця рядка (або End...)
  • Meta+ fрухається вперед "слово"
  • Meta+ bпереміщує "слово" назад

Ви можете використовувати їх для "вбивства" (він же "вирізати") з рядка:

  • Ctrl+ kвбиває ("вирізає") текст з поточного положення курсору до кінця рядка
  • Ctrl+ yyanks ("вставляє") нещодавно вбитий текст назад у буфер при курсорі

Таким чином, ви можете об'єднати їх, щоб вибрати фрагмент деякого командного рядка, який ви хочете повторити, вбити, а потім вставити його в кінець наступної команди.


Тепер, щоб зробити це ще веселіше, розглянемо розширення історії bash . Це те, !!що відповідь Студента згадує . Брейки розширення Історії вниз в десігнаторамі події , слова десігнаторов і модифікатори .

Дизайнери подій виглядають приблизно так (знову дивіться посилання для повного списку):

  • ! - починається підміна історії
  • !n- n-я команда у списку історії bash, для деякого цілого n (працює і для негативів)
  • !!- попередня команда; дорівнює!-1
  • !string- остання команда, що починається з рядка

Словознавці вибирають певні частини події. Використовуйте :для відокремлення події від позначення слова. Слова нумеруються від 0, починаючи з початку рядка, і вставляються у поточний рядок, розділений проміжками.

  • $- позначає останній аргумент (наприклад !!:$, останній аргумент останньої команди; може бути скорочений до !$)
  • n- позначає n-е слово (наприклад !str:2, другий аргумент останньої команди, що починається з str ; !!:0це команда останньої команди)

Отже, для подальшого виконання вашого прикладу, якщо ваша остання команда mkdir /some/really/long/path, просто запущена !!команда повторно повторить цю команду. Але ви хочете, щоб cdна цей шлях:

$ cd !$

Тепер скажімо, що ви виконуєте деякі інші команди, а потім хочете знову повернутися до цього шляху. Якщо це була остання команда mkdir, яку ви запустили, ви можете використовувати це для повторення цього шляху:

$ tar czf ~/foo.tgz !mkdir:$

Ви також можете прив’язати ці (та інші команди Readline) до будь-яких комбінацій клавіш; див. розділ 8.4 посібника, Команди для змінного читання для ліній : gnu.org/software/bash/manual/… та розділ 8.3, Файл readline Init: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quack quixote

дякую, що справді допомагає. Хоча "читати посібник" було якось очікуваним, згадка про основні переміщення навколо прив'язок дійсно допомагає. Навіть просто знати ctrl-a може бути реальною економією.
Дан Розенстарк

@quack, немає проблем, я пішов на наступну версію, насправді :)
Dan Rosenstark,

1
також відмітьте bind -pабо bind -Pроздрукуйте ваші поточні палітурки; це остаточна орієнтація на те, що використовує ваш баш .
шарлатаний кіхот

1
Я думаю, що ця відповідь зросла: матеріали щодо розширення історії чудові.
Дан Розенстарк

6

Якщо ви користувач vi, ви можете перевести оболонку в режим vi, ввівши set -o vi.

Потім ви можете робити всі види потужних речей у командному рядку після введення Esc + k.

Один я використовую найбільше, Esc+Kто/ будь-який текст , набраний після коса риска буде використовуватися для пошуку по історії командного рядка.

наприклад Esc + k /smbclient , дасть останню введену команду smbclient. Ви можете прокручувати всі пошукові запити, використовуючи стандартні клавіші vi ( jіk вгору і вниз, але, думаю, стрілки вгору і вниз теж будуть працювати).

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

Ура, Стю.


хоча режим vi для мене марний, оскільки я ще не перейшов до vi, чорнило l надзвичайне. Дякую за це!
Дан Розенстарк

1
Еквівалент без режиму vi - ctrl-r. Введіть його, а потім частину попередньої команди. Він відобразить останнє виникнення того, що було набрано. Натисніть клавішу ctrl-r знову, щоб перейти до наступного. Дуже зручно.
Нердфест

3

Ви можете використовувати, !!що представляє останню команду:

% тесту
% відлуння !!
> тест

цікаво. Не впевнений, що я хочу потім маніпулювати цим рядком, використовуючи ... що?
Dan Rosenstark

це частина історичних засобів bash: gnu.org/software/bash/manual/… .. зокрема розширення історії: gnu.org/software/bash/manual/bashref.html#History-Interaction ... Примітка !!- синонім для !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
шарлатаний

2
Це дуже корисно, коли ви забудете використовувати sudo: тобто sudo !! - $ more / etc / sudoers / etc / sudoers: у дозволі відмовлено $ sudo !! sudo more / etc / sudoers [sudo] пароль для ..: # / etc / sudoers ... ... ...
user9632

@wookiebreath, дякую за це, я зараз проголосую за цю відповідь
Dan Rosenstark

0

У наведеному прикладі використовуйте! $ Для подання останнього параметра попередньої команди:

mkdir / щось / щосьельсе

cd! $

Ви також можете використовувати нумеровані варіанти, щоб витягнути конкретні параметри попередніх команд.


0

Нещодавно я знайшов цей читальний лист дуже корисним. Багато речей, яких я не знав. Я використовував !$весь час, поки не дізнався про Alt+ ., яким зараз користуюся весь час. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.