Bagaimana cara menyalin seluruh baris perintah ke clipboard saya, tanpa mouse?

20

Bayangkan saya memiliki baris ini di terminal saya:

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

Setelah mengujinya, saya ingin menyalin baris ini di atas ke clipboard saya dan menempelkannya di beberapa file skrip. Bukan output dari perintah . Tapi, lakukan ini tanpa menggunakan mouse. Saya ingin tetap menggunakan keyboard saja. Saya pikir lebih cepat seperti itu, untuk melakukan beberapa kode :)

Valter Silva
sumber

Jawaban:

22

Jawaban saya menawarkan perintah sederhana dalam tiga sintaks yang berbeda, yang semuanya bekerja sama, tetapi yang satu sedikit lebih pendek dan lebih mudah untuk mengetik daripada yang kedua. Variasi ketiga adalah apa yang disebut alias, itu berarti Anda dapat menetapkan perintah nama kustom dan memanggilnya dengan mengeksekusi itu tanpa harus mengingat hal-hal kompleks.

Persiapan:

Pertama, instal paket xselyang memungkinkan Anda untuk mengakses papan klip X dari terminal:

sudo apt-get install xsel

Variasi perintah 1 (pendek):

Setelah itu, Anda bisa mengetikkan baris berikut untuk menyalin perintah sebelumnya ke clipboard:

xsel -ib <<<!!:q

Jika Anda ingin menyalin perintah terbaru kedua, ganti !!dengan !-2, untuk penggunaan terakhir ketiga !-3dan seterusnya.

Untuk menjelaskan apa yang Anda jalankan, berikut ini beberapa rincian perintah:

  • xseladalah alat baris perintah untuk mengakses papan klip X.
    Untuk info lebih lanjut, baca manualnya secara onlineIkon halaman manual atau dengan menjalankan man xsel.

    • The -iparameter mengatakan xseluntuk membaca dari stdin (biasanya masukan berarti keyboard ini, tapi kita akan redirect sesuatu di sini)
    • The -bmenspesifikasikan parameter untuk menggunakan clipboard bukan "utama" atau "sekunder" Pilihan X.
  • <<<adalah sintaks Bash khusus yang disebut "Here String".
    Ini pada dasarnya memperluas (tidak mengevaluasi!) Argumen (hanya satu!) Setelah itu dan mengarahkan kembali sebagai string ke stdin (input standar) dari perintah sebelum / sesudahnya berdiri.

  • !!:qdisebut "perintah bang" untuk ekspansi sejarah di bash. Itu menggantikan dirinya dengan baris perintah yang sebelumnya diketik.
    Untuk info lebih lanjut, baca manual lokalnya dengan menjalankan man history(manual online tidak membantu).

    • The !!singkatan baris perintah sebelumnya dan adalah sinonim untuk !-1.
      Jelas !-2berarti kemudian baris perintah terakhir kedua. Jangan lupa tanda minus -, jika tidak maka akan mengembalikan perintah ke-2 (ke-3 / ...) yang pernah Anda ketik.
    • The :qmemodifikasi perintah bang dan memberitahu bash untuk melampirkan substitusi dalam tanda kutip tunggal ( ') untuk mencegah ekspansi lebih lanjut oleh shell.

Variasi perintah 2 (sedikit lebih lama):

echo !!:q | xsel -ib
  • echo memiliki pekerjaan sederhana untuk mencetak semua argumennya ke terminal stdout.

  • !!:qdisebut "perintah bang" untuk ekspansi sejarah di bash. Itu menggantikan dirinya dengan baris perintah yang sebelumnya diketik.

    • The !!singkatan baris perintah sebelumnya dan adalah sinonim untuk !-1. Jelas !-2berarti kemudian baris perintah terakhir kedua. Jangan lupa tanda minus -, jika tidak maka akan mengembalikan perintah ke-2 (ke-3 / ...) yang pernah Anda ketik.
    • The :qmemodifikasi perintah bang dan memberitahu bash untuk melampirkan substitusi dalam tanda kutip tunggal ( ') untuk mencegah ekspansi lebih lanjut oleh shell.
  • |adalah sebuah pipa. Ini mengarahkan output terminal ("stdout") dari perintah sebelum ke input terminal ("stdin") dari perintah setelahnya.

  • xseladalah alat baris perintah untuk mengakses papan klip X.
    Untuk info lebih lanjut, baca manualnya secara onlineIkon halaman manual atau dengan menjalankan man xsel.

    • The -iparameter mengatakan xseluntuk membaca dari stdin (biasanya masukan berarti keyboard ini, tapi kita akan redirect sesuatu di sini)
    • The -bmenspesifikasikan parameter untuk menggunakan clipboard bukan "utama" atau "sekunder" Pilihan X.

Variasi perintah 3 (alias):

Alias ​​bash adalah hal yang keren jika Anda tidak ingin mengingat perintah panjang atau rumit yang sering Anda gunakan. Anda dapat menetapkan perintah ini ke nama alias sederhana, yang bisa Anda jalankan alih-alih perintah panjang untuk mencapai yang sama.

Sayangnya, karena perintah bang adalah fitur Bash khusus dan dapat diperluas sebelum alias diselesaikan, Anda tidak bisa hanya menyebutkan salah satu variasi di atas karena !!bagian itu tidak akan berfungsi. Tapi ada solusinya.

Untuk mengatur alias, jalankan baris berikut di terminal Anda. Perhatikan bahwa Anda dapat memilih nama variabel Bash yang valid alih-alih copylastcommand:

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

Namun ini hanya persisten untuk sesi Bash Anda saat ini, yang berarti alias akan hilang setelah Anda menutup jendela terminal. Anda dapat membuatnya terus-menerus di setiap sesi Bash Anda dengan menambahkan baris ini di atas ke ~/.bashrcfile Anda , atau ke ~/.bash_aliasesfile Anda jika Anda punya.

Sekali lagi, jeda singkat dari garis:

  • alias name='command'adalah sintaks untuk menetapkan alias di Bash. Ini commandakan dijalankan setiap kali Anda mengeksekusi namemulai sekarang.

  • history -p \!\!menampilkan baris perintah yang sebelumnya dieksekusi ke stdout (output standar). Tanpa -psaklar, itu tidak hanya akan mencetak tetapi juga menjalankan perintah lagi.
    Perhatikan bahwa kita perlu melarikan diri dari poni ( !) dengan garis miring terbalik ( \), karena jika tidak bash akan memperluas mereka ketika kita mencoba untuk mengatur alias, yang tidak masuk akal karena mereka perlu di alias seperti apa adanya.
    Sekali lagi, Anda juga dapat menentukan perintah terakhir [n] dengan mengganti bang kedua dengan -n, misalnya \!-2.

  • |adalah sebuah pipa. Ini mengarahkan kembali output standar ("stdout") dari perintah sebelum ke standar terminal ("stdin") dari perintah setelahnya.

  • xseladalah alat baris perintah untuk mengakses papan klip X.
    Untuk info lebih lanjut, baca manualnya secara onlineIkon halaman manual atau dengan menjalankan man xsel.

    • The -iparameter mengatakan xseluntuk membaca dari stdin (biasanya masukan berarti keyboard ini, tapi kita akan redirect sesuatu di sini)
    • The -bmenspesifikasikan parameter untuk menggunakan clipboard bukan "utama" atau "sekunder" Pilihan X.
Komandan Byte
sumber
1
Jawaban yang bagus, tetapi bisakah Anda menghindari pipa? Cukup cantik? <<<"!!" xsel -ib
kos
@ ya, terima kasih. Itu membuatnya sedikit lebih mudah. Bisakah Anda membantu pikiran saya mengingat bagaimana <<<struktur itu dipanggil lagi? Dan saya pikir <<<!!:q xsel -iblebih baik (membiarkan perintah sejarah bang melakukan kutipan), atau apakah Anda tidak setuju?
Byte Commander
Tapi !!:qgunakan tanda kutip tunggal ( ') ...
Byte Commander
Anda benar, ekspansi akan dilakukan menggunakan <<<"!!" xsel -ib. Ya, <<<!!:q xsel -iblebih baik, lakukanlah.
kos
Nice, xselmemiliki sintaks yang menarik
Sergiy Kolodyazhnyy
5

Anda bisa menggunakan xclip:

some_command | xclip -selection c

Jadi dalam kasus Anda:

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

c singkatan clipboard.

Anda mungkin perlu menginstal xclipdulu:

sudo apt-get install xclip

EDIT:

Jika Anda hanya ingin perintah yang Anda ketikkan (bukan output) disalin ke clipboard, Anda dapat menggunakan string Di sini:

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

Atau pipa:

echo foobar | xclip -selection c
heemayl
sumber
1
Saya masih mendapatkan output perintah, tetapi saya hanya ingin garis itu sendiri.
Valter Silva
echo "command" | xclip -selection clipboard... Atau membuat script di bawah~/.bin : echo "$@" | xclip -selection clipboard. Katakanlah Anda menyimpannya sebagai "cpy", maka Anda bisa cpy youtube-dl stuffdan itu akan disalin ke clipboard tanpa dieksekusi.
Alex
Dan jika Anda ingin itu dieksekusi ... echo "$@" | xclip -selection c && $@, atau sesuatu yang lebih pintar dengan eval ...
Alex
@ValterHenrique Silakan periksa suntingan saya ..
heemayl
3

Saya baru saja membuat skrip kecil zshyang digunakan xclipuntuk melakukan ini:

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

Script ini menyalin perintah terakhir yang dimasukkan dalam shell / terminal ke clipboard sistem. Itu tidak akan bekerja pada server jarak jauh yang khas.

Saya pikir hanya perlu beberapa menit untuk menulis skrip ini, tetapi ternyata butuh waktu lama untuk membuatnya berfungsi ketika saya tersandung cara zshmenangani sejarah.

Yang tail -n 2pertama seddalam hal ini berhadapan dengan fakta bahwa perintah untuk skrip ini sendiri sedang direkam dalam sejarah dan karena itu mendapat dua baris sejarah dan menghapus yang terakhir.

Script ini berfungsi, dan itu semacam teka-teki yang menyenangkan, tetapi saya benar-benar ingin tahu apakah ada cara yang lebih sederhana atau lebih elegan dalam melakukan ini zsh.

alec
sumber
Yah Anda mungkin bisa menyederhanakan taildan sedperintah menjadi satu atau dua perintah. Perintah-perintah itu menggunakan !!yang dijelaskan di sini - harus tersedia dalam ZSH ....
Wilf
Oh, !!memang sepertinya akan sangat membantu di sini, terima kasih!
alec
0

Saya menggunakan sebagai manajer clipboard, jadi.

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

Perintah terakhir ke clipboard

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

Papan klip untuk vim scratch

alias vcb='pbpaste | vimscratch -'

ZSH spesifik

# 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

Saya pikir ide-ide ini dapat membantu Anda membuat solusi sendiri

SergioAraujo
sumber