Как скопировать всю командную строку в буфер обмена без мыши?

20

Представьте, что у меня есть эта строка в моем терминале:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=

После тестирования, я хотел бы скопировать эту строку выше в мой буфер обмена и вставить ее в некоторый файл сценария. Не вывод команды . Но, делая это, не используя мышь. Мне нравится держать руки только на клавиатуре. Я думаю, что быстрее, чтобы сделать некоторую кодировку:)

    
задан Valter Silva 01.11.2015 в 16:23
источник

3 ответа

22

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

Способ приготовления:

Сначала установите пакет xsel , который позволяет вам получить доступ к буферу X из терминала:

sudo apt-get install xsel

Изменение команды 1 (короткое):

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

xsel -ib <<<!!:q

Если вы хотите скопировать вторую последнюю команду, замените !! !-2 , для третьего последнего использования !-3 и т. д.

Чтобы объяснить, что вы используете, выполните небольшой прорыв команды:

  • xsel - это инструмент командной строки для доступа к буферам X.
    Для получения дополнительной информации прочитайте его manpage или запуском man xsel .

    • Параметр -i сообщает xsel для чтения из stdin (обычно это означает ввод с клавиатуры, но мы будем перенаправлять что-то здесь)
    • Параметр -b указывает на использование буфера обмена вместо «первичных» или «вторичных» вариантов X.
  • <<< - специальный синтаксис Bash, называемый «Here String».
    Он в основном расширяет (не оценивает!) Аргумент (только один!) После него и перенаправляет его как строку на stdin (стандартный ввод) команды до / после которой она стоит.

  • !!:q называется командой «bang» для расширения истории в bash. Он заменяет собой любую ранее введенную командную строку.
    Для получения дополнительной информации прочитайте ее локальную справочную страницу, запустив man history (онлайн-страница руководства не помогает).

    • !! обозначает предыдущую командную строку и является синонимом для !-1 .
      Очевидно, что !-2 означает вторую вторую командную строку. Не забывайте знак минус - , иначе он вернет команду 2 (3 / ...), которую вы когда-либо набрали.
    • :q изменяет команду bang и сообщает bash заключить подстановку в одинарные кавычки ( ' ), чтобы предотвратить дальнейшее расширение оболочки.

Изменение команды 2 (немного длиннее):

echo !!:q | xsel -ib
  • echo имеет простую задачу распечатать все свои аргументы на стандартный вывод терминала.

  • !!:q называется командой «bang» для расширения истории в bash. Он заменяет собой любую ранее введенную командную строку.

    • !! означает предыдущую командную строку и является синонимом для !-1 . Очевидно, что !-2 означает вторую вторую командную строку. Не забывайте знак минус - , иначе он вернет команду 2 (3 / ...), которую вы когда-либо набрали.
    • :q изменяет команду bang и сообщает bash заключить подстановку в одинарные кавычки ( ' ), чтобы предотвратить дальнейшее расширение оболочки.
  • | - это труба. Он перенаправляет вывод терминала («stdout») команды перед ним на вход терминала («stdin») команды после него.

  • xsel - это инструмент командной строки для доступа к буферам X.
    Для получения дополнительной информации прочитайте его manpage или запуском man xsel .

    • Параметр -i сообщает xsel для чтения из stdin (обычно это означает ввод с клавиатуры, но мы будем перенаправлять что-то здесь)
    • Параметр -b указывает на использование буфера обмена вместо «первичных» или «вторичных» вариантов X.

Изменение команды 3 (псевдоним):

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

К сожалению, поскольку команды bang являются специальной функцией Bash и расширяются до того, как будут решены псевдонимы, вы не можете просто перечислить один из вышеперечисленных вариантов, потому что часть !! не будет работать. Однако есть обходной путь.

Чтобы установить псевдоним, запустите следующую строку в своем терминале. Обратите внимание, что вы можете выбрать любое допустимое имя переменной Bash вместо copylastcommand :

alias copylastcommand='history -p \!\! | xsel -ib'

Это, однако, сохраняется только для вашей текущей сессии Bash, что означает, что псевдоним исчезнет после закрытия окна терминала. Вы можете сделать это постоянным в каждой из ваших сессий Bash, добавив эту строку выше в конец вашего файла ~/.bashrc или в ваш файл ~/.bash_aliases , если он у вас есть.

Опять же, короткий прорыв строки:

  • alias name='command' - это синтаксис для установки псевдонима в Bash. % Co_de% будет запущено всякий раз, когда вы будете выполнять command с этого момента.

  • name выводит ранее выполненную командную строку на stdout (стандартный вывод). Без переключателя history -p \!\! он будет не только печатать, но и снова запускать команду.
    Обратите внимание, что нам нужно избежать ошибок ( -p ) с обратными косыми чертами ( ! ), потому что в противном случае bash расширяет их, когда мы попытаемся установить псевдоним, что не имеет смысла, поскольку они должны быть в псевдониме, поскольку они .
    Опять же, вы также можете указать команду [n] -th recent, заменив второй удар \ , например. % Co_de%.

  • -n - это труба. Он перенаправляет стандартный вывод («stdout») команды перед ним на стандартный терминал («stdin») после него.

  • \!-2 - это инструмент командной строки для доступа к буферам X.
    Для получения дополнительной информации прочитайте его manpage или запуском | .

    • Параметр xsel сообщает man xsel для чтения из stdin (обычно это означает ввод с клавиатуры, но мы будем перенаправлять что-то здесь)
    • Параметр -i указывает на использование буфера обмена вместо «первичных» или «вторичных» вариантов X.
ответ дан Byte Commander 01.11.2015 в 16:48
источник
5

Вы можете использовать xclip :

some_command | xclip -selection c

Итак, в вашем случае:

youtube-dl .... | xclip -selection c

c обозначает буфер обмена.

Вам может потребоваться сначала установить xclip :

sudo apt-get install xclip

EDIT:

Если вам просто нужна команда, которую вы набрали (а не вывод) для копирования в буфер обмена, вы можете использовать здесь строки:

 xclip -selection c <<<"$(echo foobar)"

Или труба:

echo foobar | xclip -selection c
    
ответ дан heemayl 01.11.2015 в 16:28
2

Я сделал небольшой скрипт для zsh , который использует xclip для этого:

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

Этот скрипт копирует последнюю команду, которая была введена в оболочку / терминал в буфер обмена системы. Он не будет работать на типичном удаленном сервере.

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

tail -n 2 и first sed в этом имеют дело с тем фактом, что команда для этого скрипта записывается в историю, и поэтому он получает две строки истории и удаляет последнюю.

Этот скрипт работает, и это была своего рода забавная головоломка, но мне действительно интересно, есть ли более простой или элегантный способ сделать это с помощью zsh .

    
ответ дан alec 25.05.2017 в 19:20