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

20

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

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

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

Вальтер Сильва
источник

Ответы:

22

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

Приготовление:

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

sudo apt-get install xsel

Вариант команды 1 (короткий):

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

xsel -ib <<<!!:q

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

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

  • xselинструмент командной строки для доступа к буферам обмена X
    Для получения дополнительной информации, прочитайте справочную страницу онлайнЗначок Manpage или запустив man xsel.

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

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

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

Вариант команды 2 (немного длиннее):

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

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

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

  • xselинструмент командной строки для доступа к буферам обмена X
    Для получения дополнительной информации, прочитайте справочную страницу онлайнЗначок Manpage или запустив man xsel.

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

Вариант команды 3 (псевдоним):

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

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

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

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

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

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

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

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

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

  • xselинструмент командной строки для доступа к буферам обмена X
    Для получения дополнительной информации, прочитайте справочную страницу онлайнЗначок Manpage или запустив man xsel.

    • -iПараметр указывает xselна чтение из стандартного ввода (обычно этот вход средства клавиатуры, но мы будем перенаправлять что - то здесь)
    • В -bопределяет параметр , чтобы использовать буфер обмена вместо «первичных» или «вторичные» выбор Икса.
Byte Commander
источник
1
Хороший ответ, но не могли бы вы избежать трубы? Довольно пожалуйста? <<<"!!" xsel -ib
Кос
@kos да, спасибо. Это делает это немного легче. Не могли бы вы помочь моему разуму вспомнить, как <<<структура снова называется? И я думаю, что <<<!!:q xsel -ibлучше (позволить команде взрыва истории сделать цитирование), или вы не согласны?
Byte Commander
Но !!:qиспользует одинарные кавычки ( ') ...
Byte Commander
Вы правы, расширение будет выполняться с помощью <<<"!!" xsel -ib. Да, <<<!!:q xsel -ibлучше, дерзай.
Кос
Хороший, xselинтересный синтаксис
Сергей Колодяжный
5

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

some_command | xclip -selection c

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

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

c стоит для буфера обмена.

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

sudo apt-get install xclip

РЕДАКТИРОВАТЬ:

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

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

Или труба

echo foobar | xclip -selection c
heemayl
источник
1
Я все еще получаю вывод команд, но я просто хочу саму строку.
Вальтер Сильва
echo "command" | xclip -selection clipboard... Или сделать его сценарий под~/.bin : echo "$@" | xclip -selection clipboard. Допустим, вы сохранили его как «cpy», тогда вы можете cpy youtube-dl stuffскопировать его в буфер обмена без выполнения.
Алекс
И если вы хотите, чтобы это было выполнено ... echo "$@" | xclip -selection c && $@или что-то более умное с eval ...
Alex
@ValterHenrique Пожалуйста, проверьте мои правки ..
Heemayl
3

Я только что сделал небольшой скрипт для 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первое sedв этом имеет дело с тем фактом, что команда для самого сценария записывается в историю, поэтому она получает две строки истории и удаляет последнюю.

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

сельдь
источник
Ну вы, вероятно , может упростить tailи sedкоманды в одну или две команды. Те команды используют, !!что объясняется здесь - это должно быть доступно в ZSH ....
Уилф
О, !!действительно похоже, что это было бы полезно здесь, спасибо!
Алек
0

Я использую как менеджер буфера обмена, так что.

alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
vimscratch='vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' 

Последняя команда в буфер обмена

alias last2cb='fc -ln -1 | pbcopy'

Буфер обмена с нуля

alias vcb='pbpaste | vimscratch -'

ЗШ специфичный

# Copy the most recent command to the clipboard
function _pbcopy_last_command(){
    fc -ln -1 | pbcopy
}
zle -N pbcopy-last-command _pbcopy_last_command
bindkey '^x^y' pbcopy-last-command
# Ctrl-x Ctrl-y  to copy last command to the clipboard


# Edit content of clipboard on vim (scratch buffer)
function _edit_clipboard(){
    pbpaste | vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' -
}
zle -N edit-clipboard _edit_clipboard
bindkey '^x^v' edit-clipboard
# Ctrl-x Ctrl-v to edit clipboard on vim


# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}
# define run-again widget from function of the same name
zle -N run-again
bindkey '\er' run-again
# alt-r to run last command again

Я думаю, что эти идеи могут помочь вам создать собственное решение

SergioAraujo
источник