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

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

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

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

20
задан 1 November 2015 в 20:58

4 ответа

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

Подготовка:

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

sudo apt-get install xsel

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

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

xsel -ib <<<!!:q

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

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

  • xsel инструмент командной строки должен получить доступ к этим X буферам обмена.
    Для большего количества информации читайте, это - страница справочника онлайнManpage icon или путем выполнения man xsel.

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

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

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

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

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

  • !!:q назван "командой удара" для расширения истории в ударе. Это заменяет себя любой ранее введенной командной строкой.

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

  • xsel инструмент командной строки должен получить доступ к этим X буферам обмена.
    Для большего количества информации читайте, это - страница справочника онлайнManpage icon или путем выполнения man xsel.

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

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

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

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

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

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

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

Снова, короткий перерыв вниз строки:

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

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

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

  • xsel инструмент командной строки должен получить доступ к этим X буферам обмена.
    Для большего количества информации читайте, это - страница справочника онлайнManpage icon или путем выполнения man xsel.

    • -i параметр говорит xsel читать из stdin (обычно это означает ввод с клавиатуры, но мы собираемся перенаправить что-то здесь),
    • -b параметр указывает для использования буфера обмена вместо X "основные" или "вторичные" выборы.
22
ответ дан 23 November 2019 в 01:51

Можно использовать xclip:

some_command | xclip -selection c

Так в Вас случай:

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

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

Вы, возможно, должны были бы установить xclip сначала:

sudo apt-get install xclip

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

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

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

Или канал:

echo foobar | xclip -selection c
5
ответ дан 23 November 2019 в 01:51

Я просто сделал немного сценария для 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.

3
ответ дан 23 November 2019 в 01:51

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

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

команда Last к буферу обмена

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

Буфер обмена к царапине энергии

alias vcb='pbpaste | vimscratch -'

ZSH конкретный

# 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

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

0
ответ дан 23 November 2019 в 01:51

Другие вопросы по тегам:

Похожие вопросы: