Jak skopiować całą linię poleceń do mojego schowka bez myszy?

20

Wyobraź sobie, że mam tę linię w moim terminalu:

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

Po przetestowaniu chciałbym skopiować tę linię powyżej do mojego schowka i wkleić ją w pliku skryptu. Nie wyjście polecenia . Ale robienie tego bez użycia myszy. Lubię trzymać ręce tylko przy klawiaturze. Myślę, że w ten sposób jest szybciej, aby trochę kodować :)

Valter Silva
źródło

Odpowiedzi:

22

Moja odpowiedź oferuje proste polecenie w trzech różnych składniach, z których wszystkie działają jednakowo, ale jedna jest nieco krótsza i łatwiejsza do napisania niż druga. Trzecia odmiana to tak zwany alias, co oznacza, że ​​możesz przypisać komendzie niestandardową nazwę i wywołać ją, wykonując ją bez konieczności zapamiętywania skomplikowanych elementów.

Przygotowanie:

Najpierw zainstaluj pakiet, xselktóry umożliwia dostęp do schowka X z terminala:

sudo apt-get install xsel

Wariant polecenia 1 (krótki):

Następnie możesz wpisać następujący wiersz, aby skopiować poprzednie polecenie do schowka:

xsel -ib <<<!!:q

Jeśli chcesz skopiować drugie ostatnie polecenie, zamień !!je na !-2, dla trzeciego ostatniego użycia !-3i tak dalej.

Aby wytłumaczyć, co uruchamiasz, tutaj krótki podział polecenia:

  • xselto narzędzie wiersza polecenia umożliwiające dostęp do schowka X.
    Aby uzyskać więcej informacji, przeczytaj stronę podręcznika onlineIkona strony lub przez uruchomienieman xsel .

    • Ten -iparametr mówixsel czytać ze standardowego wejścia (zwykle oznacza to wprowadzanie z klawiatury, ale tutaj coś przekierujemy)
    • Ten -bparametr określa użycie schowka zamiast „podstawowych” lub „wtórnych” opcji X.
  • <<<to specjalna składnia Basha o nazwie „Here String”.
    Zasadniczo rozwija (nie ocenia!) Argument (tylko jeden!) Po nim i przekierowuje go jako ciąg znaków na standardowe wejście (standardowe wejście) polecenia przed / po którym stoi.

  • !!:qnazywa się „poleceniem huku” w celu rozszerzenia historii w bash. Zastępuje się dowolnym wcześniej wpisanym wierszem poleceń.
    Aby uzyskać więcej informacji, przeczytaj lokalną stronę podręcznika, uruchamiającman history (strona internetowa nie jest pomocna).

    • !!Oznacza poprzedniego wiersza poleceń i jest synonimem !-1.
      Oczywiście !-2oznacza to drugą ostatnią linię poleceń. Nie zapomnij znaku minus- , w przeciwnym razie zwróci 2. (3. / ...) polecenie, które kiedykolwiek wpisałeś.
    • W :qmodyfikuje polecenie Bang mówi bashowi dołączyć zastąpienie w apostrofami ( '), aby zapobiec dalszej ekspansji przez powłokę.

Wariant polecenia 2 (nieco dłuższy):

echo !!:q | xsel -ib
  • echo ma proste zadanie wypisania wszystkich argumentów na standardowe wyjście terminala.

  • !!:qnazywa się „poleceniem huku” w celu rozszerzenia historii w bash. Zastępuje się dowolnym wcześniej wpisanym wierszem poleceń.

    • !!Oznacza poprzedniego wiersza poleceń i jest synonimem !-1. Oczywiście !-2oznacza to drugą ostatnią linię poleceń. Nie zapomnij znaku minus- , w przeciwnym razie zwróci 2. (3. / ...) polecenie, które kiedykolwiek wpisałeś.
    • W :qmodyfikuje polecenie Bang mówi bashowi dołączyć zastąpienie w apostrofami ( '), aby zapobiec dalszej ekspansji przez powłokę.
  • |jest fajką. Przekierowuje wyjście terminala („stdout”) polecenia przed nim do wejścia terminala („stdin”) polecenia po nim.

  • xselto narzędzie wiersza polecenia umożliwiające dostęp do schowka X.
    Aby uzyskać więcej informacji, przeczytaj stronę podręcznika onlineIkona strony lub przez uruchomienieman xsel .

    • Ten -iparametr mówixsel czytać ze standardowego wejścia (zwykle oznacza to wprowadzanie z klawiatury, ale tutaj coś przekierujemy)
    • Ten -bparametr określa użycie schowka zamiast „podstawowych” lub „wtórnych” opcji X.

Wariant polecenia 3 (alias):

Alias ​​bash jest fajną rzeczą, jeśli nie chcesz pamiętać długich lub skomplikowanych poleceń, których często używasz. Możesz przypisać to polecenie do prostej nazwy aliasu, którą możesz uruchomić zamiast długiego polecenia, aby osiągnąć to samo.

Niestety, ponieważ polecenia Bang są specjalną funkcją Bash i są rozszerzane przed usunięciem aliasów, nie można po prostu aliasować jednej z powyższych odmian, ponieważ !! część nie będzie działać. Istnieje jednak obejście.

Aby ustawić alias, uruchom następujący wiersz w swoim terminalu. Pamiętaj, że możesz wybrać dowolną prawidłową nazwę zmiennej Bash zamiast copylastcommand:

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

Jest to jednak trwałe tylko w bieżącej sesji Bash, co oznacza, że ​​alias zniknie po zamknięciu okna terminala. Możesz ustawić go jako trwały w każdej sesji Bash, dodając ten wiersz powyżej na końcu ~/.bashrcpliku lub do ~/.bash_aliasespliku, jeśli taki masz.

Ponownie krótki podział linii:

  • alias name='command'jest składnią ustawiania aliasu w Bash. commandZostanie uruchomiony w dowolnym momencie wykonać nameod teraz.

  • history -p \!\!wypisuje poprzednio wykonaną linię poleceń na standardowe wyjście (standardowe wyjście). Bez -pprzełącznika nie tylko wydrukowałby, ale także ponownie uruchomił polecenie.
    Zauważ, że musimy uciec przed bangs ( !) za pomocą ukośników odwrotnych ( \), ponieważ w przeciwnym razie bash rozszerzy je, gdy spróbujemy ustawić alias, co nie ma sensu, ponieważ muszą znajdować się w tym aliasie, jakimi są.
    Ponownie możesz również podać [n] -te ostatnie polecenie, zastępując drugi huk -nnp \!-2.

  • |jest fajką. Przekierowuje standardowe wyjście („stdout”) polecenia przed nim do standardu terminala („stdin”) polecenia po nim.

  • xselto narzędzie wiersza polecenia umożliwiające dostęp do schowka X.
    Aby uzyskać więcej informacji, przeczytaj stronę podręcznika onlineIkona strony lub przez uruchomienieman xsel .

    • Ten -iparametr mówixsel czytać ze standardowego wejścia (zwykle oznacza to wprowadzanie z klawiatury, ale tutaj coś przekierujemy)
    • Ten -bparametr określa użycie schowka zamiast „podstawowych” lub „wtórnych” opcji X.
Bajt Dowódca
źródło
1
Dobra odpowiedź, ale czy mógłbyś uniknąć fajki? Pięknie proszę? <<<"!!" xsel -ib
Kos
@ Kos tak, dziękuję. To sprawia, że ​​jest to trochę łatwiejsze. Czy możesz mi pomóc przypomnieć sobie, jak <<<nazywa się ta struktura? I myślę, że <<<!!:q xsel -ibjest lepiej (pozwalając cytatowi na polecenie historii huku), czy też się nie zgadzasz?
Bajt Dowódca
Ale !!:qużywa pojedynczych cudzysłowów ( ') ...
Byte Commander
Masz rację, rozbudowa zostanie wykonana przy użyciu <<<"!!" xsel -ib. Tak, <<<!!:q xsel -iblepiej, idź.
Kos
Fajnie, xselma ciekawą składnię
Sergiy Kolodyazhnyy
5

Możesz użyć xclip:

some_command | xclip -selection c

Więc w twoim przypadku:

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

c oznacza schowek.

Może być konieczne xclipnajpierw zainstalowanie :

sudo apt-get install xclip

EDYTOWAĆ:

Jeśli chcesz tylko, aby wpisane polecenie (a nie wynik) zostało skopiowane do schowka, możesz użyć ciągów Here:

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

Lub rura:

echo foobar | xclip -selection c
heemayl
źródło
1
Nadal otrzymuję dane wyjściowe poleceń, ale po prostu chcę samej linii.
Valter Silva,
echo "command" | xclip -selection clipboard... Albo zrobić to skrypt pod~/.bin : echo "$@" | xclip -selection clipboard. Powiedzmy, że zapisałeś go jako „cpy”, wtedy mógłbyś cpy youtube-dl stuffi zostałby skopiowany do schowka bez wykonania.
Alex
A jeśli chcesz to wykonać ... echo "$@" | xclip -selection c && $@lub coś bardziej sprytnego z eval ...
Alex
@ValterHenrique Proszę sprawdzić moje zmiany ..
heemayl
3

Właśnie stworzyłem mały skrypt dla zshtych zastosowań, xclipaby to zrobić:

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

Ten skrypt kopiuje ostatnie polecenie wprowadzone w powłoce / terminalu do schowka systemu. Nie działałoby na typowym zdalnym serwerze.

Pomyślałem, że napisanie tego skryptu zajmie mi tylko kilka minut, ale zadziałało zaskakująco długo, zanim potknąłem się o drogę zsh historią.

tail -n 2I pierwszysed w tym do czynienia z faktem, że komenda dla samego tego skryptu jest rejestrowane w historii i tak robi się dwa wiersze historii i usuwa ostatni.

Ten skrypt działa i była zabawną łamigłówką, ale jestem naprawdę ciekawy, czy istnieje prostszy lub bardziej elegancki sposób na zrobienie tego zsh.

alec
źródło
Cóż, prawdopodobnie możesz uprościć polecenia taili sedw jedno lub dwa polecenia. Komendy te wykorzystują !!wyjaśnienie tutaj - powinno być dostępne w ZSH ....
Wilf,
Och, !!rzeczywiście wygląda na to, że byłoby to pomocne tutaj, dzięki!
alec
0

Używam jako menedżera schowka, więc.

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

Ostatnie polecenie do schowka

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

Schowek do vim scratch

alias vcb='pbpaste | vimscratch -'

ZSH specyficzne

# 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

Myślę, że te pomysły pomogą ci stworzyć własne rozwiązanie

SergioAraujo
źródło