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


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визначає параметр , щоб використовувати буфер обміну замість «первинних» або «вторинні» вибір Ікса.
  • <<<є спеціальним синтаксисом Баша під назвою "Here String".
    Він в основному розширює (не оцінює!) Аргумент (лише один!) Після нього і перенаправляє його як рядок до stdin (стандартного вводу) команди перед / після якого він стоїть.

  • !!:qназивається "командою bang" для розширення історії в bash. Він замінює себе будь-яким раніше введеним командним рядком.
    Для отримання додаткової інформації читайте, що це локальна сторінка, запустівши man history(онлайн-сторінка не корисна).

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

Варіант команди 2 (трохи довше):

echo !!:q | xsel -ib
  • echo має просту роботу надрукувати всі свої аргументи до строки терміналу.

  • !!:qназивається "командою bang" для розширення історії в bash. Він замінює себе будь-яким раніше введеним командним рядком.

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

  • xselє інструментом командного рядка для доступу до буферів обміну X.
    Для отримання додаткової інформації прочитайте його в ІнтернетіПіктограма manpage або запустивши man xsel.

    • -iПараметр вказує xselна читання зі стандартного вводу (зазвичай цей вхід кошти клавіатури, але ми будемо перенаправляти що - то тут)
    • В -bвизначає параметр , щоб використовувати буфер обміну замість «первинних» або «вторинні» вибір Ікса.

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

Баш-псевдонім - класна річ, якщо ви не хочете згадувати довгі або складні команди, якими часто користуєтеся. Ви можете призначити цю команду простому псевдоніму, яке можна виконати замість довгої команди, щоб досягти того самого.

На жаль, оскільки команди bang є спеціальною функцією 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] -й останню команду, замінивши другу вибух -n, наприклад \!-2.

  • |- це труба. Він перенаправляє стандартний вихід ("stdout") команди перед ним до термінального стандарту ("stdin") команди після нього.

  • xselє інструментом командного рядка для доступу до буферів обміну X.
    Для отримання додаткової інформації прочитайте його в ІнтернетіПіктограма manpage або запустивши man xsel.

    • -iПараметр вказує xselна читання зі стандартного вводу (зазвичай цей вхід кошти клавіатури, але ми будемо перенаправляти що - то тут)
    • В -bвизначає параметр , щоб використовувати буфер обміну замість «первинних» або «вторинні» вибір Ікса.

1
Гарна відповідь, але ти міг уникнути труби? Досить будь ласка? <<<"!!" xsel -ib
kos

@kos так, спасибі Це робить його трохи простіше. Не могли б ви допомогти моєму розуму пригадати, як <<<структура знову називається? І я думаю <<<!!:q xsel -ib, що краще (дозволити команді історія баг виконувати цитування), чи ти не згоден?
Байт-командир

Але !!:qвикористовує одинарні лапки ( ') ...
Байт командир

Ви маєте рацію, розширення буде виконуватися за допомогою <<<"!!" xsel -ib. Так, <<<!!:q xsel -ibкраще, займіться цим.
kos

Приємно, 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

1
Я все одно отримую команди, але я просто хочу, щоб ця лінія була самою.
Вальтер Сільва

echo "command" | xclip -selection clipboard... Або зробити його сценарій під~/.bin : echo "$@" | xclip -selection clipboard. Скажіть, ви збережете це як "копіювальний", тоді ви могли б cpy youtube-dl stuffі це буде скопійовано у буфер обміну без виконання.
Олексій

І якщо ви хочете, щоб він був виконаний ... echo "$@" | xclip -selection c && $@або щось розумніше з eval ...
Олексій

@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 ....
Уілф

О, !!справді виглядає, що тут було б корисно, дякую!
alec

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'

Буфер обміну для нуля vim

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

Я думаю, що ці ідеї можуть допомогти вам створити власне рішення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.