Як швидко отримати попередній рядок у терміналі без використання миші?


13

Термінал Linux (наприклад, Ubuntu), чи є спосіб отримати останній рядок? Скажіть, я випадковим чином набираю tdкоманду, яка не була встановлена ​​в моїй системі, тому я отримаю повідомлення, як показано нижче. Я хотів би мати "ярлик" для sudo apt-get install textdrawшвидкого запуску .

Чи є такий інструмент чи як я можу скопіювати останній рядок у буфер обміну без використання миші?

username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$

Натиснути стрілку вгору? Ви пробували це? Також перегляньте команду історії в Linux, яка може працювати і для вас.
Richie086

Програми термінальних мультиплексорів, tmux та екран, забезпечують можливість отримання тексту в буфер обміну. Однак у графічному інтерфейсі Ubuntu за замовчуванням може бути простіший спосіб, тому я підозрюю, що може бути простішою відповідь. Натискання клавіш PgUp, Shift-PgUp або Ctrl-PgUp може призвести до прокрутки.
TOOGAM

3
@ Richie086 Зауважте, що мені потрібно sudo apt-get install textdraw, а не td. стрілка вгору дасть мені лишеtd
Даніель,

Відповіді:


6

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

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

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

Приклади, показані у сховищі, показують декілька згаданих вами сценаріїв.

введіть тут опис зображення


2

Коротка відповідь: ні, напевно, у вас немає доступного методу для цього.

Довга відповідь:

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

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

Наприклад, я використовую vi-like-emacs для видачі спеціальних команд оболонки. Якщо вони не потребують додаткового введення, добре працює, щоб запустити їх у вікні , захоплюючи вихід команди і редагуючи вихід, якщо це потрібно для вдосконалення команди. Emacs також дозволяє зробити щось подібне, а також vim.


2

Якщо ви отримали це повідомлення в ubuntu після запуску неіснуючої команди з bash, ваша система, ймовірно, використовує command_not_found_handleфункцію. Ви можете побачити це в /etc/bash.bashrc.

Тривіальний злом може бути варіантом: я щойно створив сценарій з назвою cnfh:

#!/bin/bash

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi


"$@"
RET_VAL=$?
if [ $RET_VAL -eq 127 ]; then
  OUT=$(command_not_found_handle "$@" 2>&1)
  $(echo $OUT |sed -n 's/.*\(apt-get install .\+\)$/\1/p')
fi

Потім запустіть команду td за допомогою цього сценарію:

# ./cnfh td

Використання Ubuntu 14.04.2 LTS . Я сподіваюся, що це допомагає.


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

2

У tmux v2.4 і далі (оскільки ця фіксація https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 ) з send-keys -X. Це можливо в старих версіях з іншим синтаксисом.

В .tmux.conf:

bind ! copy-mode \;\
       send-keys -X cursor-up \;\
       send-keys -X select-line \;\
       send-keys -X cursor-left \;\
       send-keys -X copy-selection-and-cancel \;\
       paste-buffer

Тепер prefix+!буде скопійовано останній рядок у поточній позиції курсору.

cursor-left Ви можете залишити його, якщо ви хочете виконати його безпосередньо, не набираючи return.

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


1

Щоб виконати останній рядок виводу з останньої команди, якщо ви готові повторно виконати цю команду (оскільки вона нічого не робила, крім видачі діагностичного повідомлення), виконайте

$($(fc -ln -1) | tail -n 1)

Крок за кроком (шар за шаром):

  • fc (яка може означати «Фіксувати команду») - це команда, вбудована в оболонку для доступу до історії команд.

    • -ln
      • l(нижній регістр L) - l ist попередня команда (и)
      • n- не включати команду n чисел
    • 1 (one) - відноситься до останньої команди

    fc -ln -1 перераховує останню команду, не включає номер команди.

  • $(fc -ln -1) виконує останню команду.
  • $(fc -ln -1) | tail -n 1виконує останню команду та відображає останній рядок її виводу. Це sudo apt-get install textdrawрядок у вашому прикладі.
  • $($(fc -ln -1) | tail -n 1)виконує цю команду.

Ви можете це псевдонімом:

alias execute_last_line_of_output_from_previous_command='$($(fc -ln -1) | tail -n 1)'

Я залишаю вам вибрати коротше ім’я для псевдоніма.

Примітки:

  • Це працює тільки для простих команд - без спеціальних символів , як |, <, >, ;, &, або навіть лапки. Якщо вам потрібно обробляти складні команди, ви, ймовірно, можете це зробити, додавши an eval, але це широко не рекомендується.
  • Якщо вам потрібно отримати доступ до чогось іншого, ніж останній рядок виводу (наприклад, останній рядок від сімнадцятого до останнього), ви можете зробити щось tail -n 17 | head -n 1.
  • Якщо вам потрібно отримати доступ до чогось іншого, ніж остання команда, ви можете змінити аргументи fc. Зауважте, що fc -ln -1це короткий для fc -ln -1 -1. Щоб отримати третю останню команду, використовуйте fc -ln -3 -3.
  • Якщо вам потрібна гнучкість, як описано вище, ви, ймовірно, повинні написати функцію оболонки, яка бере аргументи, а не псевдонім.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.