Терминал - копирование из CLI без использования мыши

20

Во время запуска команд в CLI я хочу скопировать только что сработавшую команду или что-либо, что я написал в терминале, и вставить ее в другое место без использования мыши.

Как и на следующем рисунке, я хочу скопировать команду обновления (полностью или частично) без использования мыши и вставить ее куда-нибудь.

копировать из CLI без использования мыши

prayagupd
источник
1
Вы используете гном без мыши?
ot--

Ответы:

11

Вы можете использовать screen(1) в эмуляции терминала выбора ( xterm, gnome-terminal, ...).

Необходимая вам функциональность встроена screen. Вам нужно ознакомиться с тем, как это работает:

  • по умолчанию привязка клавиш «команда» - это Ctrl+ A, вы составляете команды, выполняя последовательность «команда» плюс определенное действие.
  • команда "копировать": AltGr+[
  • команда "вставить" AltGr+]

Вы можете «скопировать» команду и «вставить» в другой терминал.

screen это весело, и как только вы начнете использовать его, вы будете удивляться, как это возможно, вы вообще не использовали его.

Дауд
источник
Команды не было screen, поэтому я установил ее в gnome-терминал и запустил screenв терминале. Но не мог начать после этого. Также я не понял, что вы подразумеваете под встроенным экраном.
praagagupd
1
Читать man screen. Кроме того, я написал «встроенный в экран», что означает, что функция копирования / вставки присутствует в screen дизайне .
Дауд
Вам нужно использовать spaceключ, чтобы выбрать желаемую область. Вы должны использовать, Yчтобы скопировать всю строку или желаемую область. Экран удобен для viдвижений.
FelikZ
какой AltGrключ? У меня естьAlt
alhelal
1
screenИнструмент не функционирует объяснил здесь. И это, похоже, не дает ответа на вопрос.
Луис де Соуза
7

В дополнение к уже предоставленным ответам, вы можете перейти к более гибкому эмулятору терминала.

Если вы были готовы изменить терминалы на rxvt-unicode , вы могли бы использовать такой инструмент, как urxvt-perls : набор скриптов, которые обеспечивают следующие функциональные возможности клавиатуры в этом эмуляторе терминала:

  • выбрать, скопировать и вставить текст
  • прямой и обратный поиск
  • выделять и открывать URL-адреса в выбранном вами браузере

Вы просто устанавливаете пакет, а затем добавляете несколько строк в свой ~/.Xresources, и затем вы можете отключить грызуна навсегда.

jasonwryan
источник
4

Вы можете сделать это с помощью такой программы xclip:

NAME
   xclip - command line interface to X selections (clip‐
   board)

После того, как вы установили его, вы можете использовать его для подключения к буферу обмена X. К сожалению, в вашей mysqlсреде это не сработает (у него есть собственный буфер для скопированных строк), но сработает, если вы захотите выполнить «обычную» команду. Например :

$ This is a long command line

Введите, CtrlAчтобы перейти к началу строки, заключите команду в кавычки, а затем введите ее:

$ echo -e "This is a long command line" |xclip 

Теперь у вас есть «Это длинная командная строка» в буфере обмена среднего щелчка.

Если вы хотите вставить без использования мыши, это будет зависеть от того, где вы вставляете. Вы можете вставить в другой терминал, запустив:

$ xclip -o

Вы можете вставить в тот же терминал, просто убивая (обрезая) команду с помощью, CtrlKа затем вставляя с помощью CtrlY.

Вы также можете сохранять команды через терминалы, используя историю bash. Добавьте эту строку в ваш ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDэто специальная переменная bash. Если оно установлено, значение выполняется как команда перед выдачей нового приглашения. history -aзапишет историю текущего сеанса в файл истории и history -rперезагрузит этот файл. Это означает, что каждая команда, которую вы выполняете, будет немедленно записана в файл истории.

Теперь, когда вы запускаете длинную командную строку, вы можете переключиться на другой терминал и нажать клавишу возврата (просто запустить $PROMT_COMMAND, или открыть новое окно терминала), и он будет доступен для истории этого терминала. Если вы сейчас нажмете, Upвы можете запустить его на новом терминале.

Тердон
источник
Это нормально, но я все еще должен использовать мышь?
praagagupd
@PrayagUpd ах, да, это скопирует в буфер среднего щелчка. Смотрите обновленный ответ для другого способа.
Тердон
Я думаю, что $ xclip -oэто не то, что я хочу, потому что это просто печатает то, что я xclipeсделал. Но +1 за, Ctrl+Aа затем Ctrl+Kи Ctrl+Yдля резки и вставки по крайней мере в том же терминале.
prayagupd
@PrayagUpd дело в том, что существуют различные буферы буфера обмена, и решение будет зависеть от того, что именно вы хотите сделать. Не могли бы вы обновить свой вопрос конкретным примером того, что вам нужно? Я имею в виду копирование откуда (mysql будет сложно) и куда.
Тердон
1
@PrayagUpd см обновленный ответ для другого трюка.
Тердон
1

@evilsoup предложил хорошее решение, но оно часто ломается.

Быстрое решение

Вот решение, которое никогда не ломается .

history | tail -2 | head -1 | xclip -selection clipboard

Просто запустите эту команду, и она скопирует команду, которую вы только что выполнили, в буфер обмена.

По сути, он печатает историю ваших команд, берет вторую последнюю команду и передает ее в буфер обмена (последняя команда это сама, поэтому она выбирает вторую последнюю команду).

Пользовательская функция

Разрабатывая быстрое решение, я написал небольшую функцию, которая довольно умна и скопирует последнюю использованную команду. Вы также можете предоставить числовые аргументы для копирования последней n-й команды. Например, для копирования второй последней команды укажите в 2качестве аргумента

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

Скопируйте и вставьте вышеуказанную функцию в ваш ~/.bashrcфайл. Обратите внимание, что если вы поместите это в отдельный файл скрипта bash и запустите скрипт, он не будет работать, так как команда history не сможет получить доступ к вашей истории в этом случае.

Наконец, запустите его как:

myclipcopy 3
# This copies the third-last command

Более того, одна из замечательных функций, добавленных к этой функции, заключается в том, что она удаляет себя из истории после запуска. Это полезно, потому что тогда «обратный» индекс команд не изменяется.

shivams
источник
Это не надежно .
mikeserv
@mikeserv: я переименовал его теперь в «Пользовательскую функцию». Но почему вы это понизили? Разве вы не замечаете, что это правильно отвечает на вопрос? Более того, почему я сказал «надежный», потому что он никогда не сломался. Понижая голос, вы просто скрываете соответствующий ответ от поста.
Шивамс
Я понизил голосование, потому что вы предполагаете многое : особенно bash и linux, ни один из которых не указан в вопросе. Кроме того, ваш конвейер невероятно усложнен, и то же самое верно для вашего регулярного выражения
mikeserv
@mikeserv: Спасибо за комментарий. Надеюсь, это поможет мне получить лучшие ответы. Я признаю, что мои регулярные выражения и конвейеры ужасны. Но они хорошо проверены и я им пользуюсь. А что касается предположений, вы заметили, что ответ с самым высоким рейтингом основывался на предположении, которое использовал пользователь screen. Второй по рейтингу ответ также предполагал bashи linux. Более того, допущение bashне имеет большого значения, потому что скрипт все равно будет работать в zsh или большинстве других оболочек.
Шивамс
Я не сказал, что это было некрасиво - я сказал, что это было слишком сложно. И нет, это не будет работать нормально в большинстве других оболочек . И более того, CLI, фактически изображенный в этом вопросе, является MySQL. Хорошие замечания по поводу других ответов, хотя.
mikeserv
0

Эта команда использует расширение истории bash (поэтому !!расширяется до последней строки, которую вы ввели в терминал). Вы, вероятно , придется установить либо xclipили xsel.

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

Это поместит вашу последнюю команду в буфер обмена Ctrl+ v, так что вы сможете вставить ее в любую программу с графическим интерфейсом (или с Ctrl+ Shift+ vв большинстве эмуляторов терминала, или с помощью "+pvim).

Это сломается для некоторых строк, содержащих двойные кавычки, например:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

Это будет работать для команды, которую вы дали в качестве примера; у вас должны быть проблемы только в случае выхода двойных кавычек ; & && | ||и т. д.

evilsoup
источник
Спасибо за этот ответ, это было наиболее практичное решение, которое я мог немедленно реализовать. И я считаю, что проблем с «можно избежать, просто не заключая в кавычки !!, просто сделайте, echo !!и это будет работать безупречно (за исключением невероятного случая, с которого начиналась ваша предыдущая команда, -nили -eнескольких других опций, которые она echoсама принимает).
sundar - Восстановить Монику
0

Возможно, это не самое удобное решение, но я использую его, и поэтому оно может быть полезным для других, поскольку не требует дополнительной установки программного обеспечения.

  1. Вам нужно создать временный файл в любом удобном каталоге

  2. Перенесите нужное направление или текст в этот файл. Для передачи направления вы можете использовать

    echo $(pwd) 1> tempo
    
  3. Чтобы получить направление из файла, используйте команду

    cd $(tail -n 1 tempo)
    

Для копирования и вставки команд эта система, конечно, будет работать. Надеюсь, это было полезно

Дмитрий Кормулев
источник
Кусалананда спасибо за редактирование. Теперь ответ выглядит намного лучше
Дмитрий Кормулев