Komut satırının tamamı farem olmadan panomuza nasıl kopyalanır?


20

Bu hattın benim terminalimde olduğunu hayal edin:

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

Test ettikten sonra, bu satırı yukarıdaki panoya kopyalayıp bir komut dosyasına yapıştırmak istiyorum. Komutun çıktısı değil . Ancak, fareyi kullanmadan bunu yapıyor. Ellerimi sadece klavyede tutmayı seviyorum. Bence bu şekilde daha hızlı, biraz kodlama yapmak :)

Yanıtlar:


22

Cevabım, hepsi eşit olarak çalışan, ancak biri ikinciden biraz daha kısa ve daha kolay olan üç farklı sözdiziminde basit bir komut sunuyor. Üçüncü varyasyon sözde bir takma addır, yani komuta özel bir ad atayabilir ve karmaşık şeyleri hatırlamak zorunda kalmadan çalıştırarak çağırabilirsiniz.

Hazırlık:

İlk xselönce, terminalden X panosuna erişmenizi sağlayan paketi kurun :

sudo apt-get install xsel

Komut varyasyonu 1 (kısa):

Bundan sonra, önceki komutu panoya kopyalamak için aşağıdaki satırı yazabilirsiniz:

xsel -ib <<<!!:q

Eğer, ikinci son komutu kopyalayıp değiştirmek istiyorsanız !!ile !-2üçüncü en son kullanıma, !-3vb.

Neyi çalıştırdığınızı açıklamak için, işte komuttan kısa bir açıklama:

  • xselX panolarına erişmek için bir komut satırı aracıdır.
    Daha fazla bilgi için, çevrimiçi olarakManpage simgesi veya çalışan bir sayfa olduğunu okuyun man xsel.

    • -iParametre söyler xselstdin'den okumak için (genellikle bu araçlar klavye girişi, ama biz burada yönlendirme şeye gidiyoruz)
    • -bParametre belirtir panoya yerine X'in "birincil" veya "ikincil" kullanıldığını görelim.
  • <<<"Here String" adlı özel bir Bash sözdizimidir.
    Temelde argümanı (sadece bir!) Sonra genişletir (değerlendirmez!) Ve onu durmadan önce / sonra komutun stdin'ine (standart giriş) dizge olarak yönlendirir.

  • !!:qbash tarihinin genişlemesi için "bang komutu" olarak adlandırılır. Önceden yazılmış herhangi bir komut satırıyla kendini değiştirir.
    Daha fazla bilgi için, yerel manpage sayfasını çalıştırarak okuyun man history(çevrimiçi manpage yardımcı değildir).

    • !!Bir önceki komut satırı anlamına gelir ve eş anlamlıdır !-1.
      Açıkçası !-2o zaman ikinci son komut satırı anlamına gelir. Eksi işaretini unutmayın -, aksi takdirde yazdığınız 2. (3. / ...) komutu geri döner.
    • :qDeğiştirir patlama komutu ve tek tırnak ikame çevrelemek için Bash söyler ( ') kabuk tarafından daha fazla genişlemesini önlemek için.

Komut varyasyonu 2 (biraz daha uzun):

echo !!:q | xsel -ib
  • echo Tüm argümanlarını terminalin stdout'una basma işine sahiptir.

  • !!:qbash tarihinin genişlemesi için "bang komutu" olarak adlandırılır. Önceden yazılmış herhangi bir komut satırıyla kendini değiştirir.

    • !!Bir önceki komut satırı anlamına gelir ve eş anlamlıdır !-1. Açıkçası !-2o zaman ikinci son komut satırı anlamına gelir. Eksi işaretini unutmayın -, aksi takdirde yazdığınız 2. (3. / ...) komutu geri döner.
    • :qDeğiştirir patlama komutu ve tek tırnak ikame çevrelemek için Bash söyler ( ') kabuk tarafından daha fazla genişlemesini önlemek için.
  • |bir boru. Komutun terminal çıkışını ("stdout"), önceki komutundan sonra terminal komutuna ("stdin") yönlendirir.

  • xselX panolarına erişmek için bir komut satırı aracıdır.
    Daha fazla bilgi için, çevrimiçi olarakManpage simgesi veya çalışan bir sayfa olduğunu okuyun man xsel.

    • -iParametre söyler xselstdin'den okumak için (genellikle bu araçlar klavye girişi, ama biz burada yönlendirme şeye gidiyoruz)
    • -bParametre belirtir panoya yerine X'in "birincil" veya "ikincil" kullanıldığını görelim.

Komut varyasyonu 3 (diğer ad):

Bir bash takma adı, sık kullandığınız uzun veya karmaşık komutları hatırlamak istemiyorsanız harika bir şeydir. Bu komutu, aynı elde etmek için uzun komut yerine çalıştırabileceğiniz basit bir diğer ad adına atayabilirsiniz.

Ne yazık ki, bang komutları özel bir Bash özelliği olduğundan ve takma adlar çözümlenmeden önce genişletildiğinden, !!bölüm çalışmaz çünkü yukarıdaki varyasyonlardan birini takma adlandırma yapamazsınız. Yine de bir geçici çözüm var.

Diğer adı ayarlamak için terminalinizde aşağıdaki satırı çalıştırın. Bunun yerine herhangi bir geçerli Bash değişken adı seçebileceğinizi unutmayın copylastcommand:

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

Ancak bu, yalnızca geçerli Bash oturumunuz için kalıcıdır; başka bir deyişle, takma ad, terminal penceresini kapattıktan sonra kaybolacaktır. Bu satırı, ~/.bashrcdosyanızın sonuna ya da ~/.bash_aliasesvarsa dosyanızın sonuna ekleyerek Bash oturumlarınızın her birinde kalıcı yapabilirsiniz .

Yine, hattın kısa bir parça:

  • alias name='command'Bash'de bir takma ad belirlemek için kullanılan sözdizimidir. Bundan commandsonra ne zaman çalıştırılsa çalıştırılacak name.

  • history -p \!\!daha önce yürütülen komut satırını stdout'a (standart çıktı) verir. -pAnahtar olmadan sadece yazdırmaz, aynı zamanda komutu tekrar çalıştırırdı.
    Patlamalardan ( !) ters eğik çizgi ( ) ile kaçmamız gerektiğine dikkat edin \, çünkü aksi halde bash, diğer adları olduğu gibi kullanmayacak kadar anlamlı olan takma adı belirlemeye çalıştığımızda onları genişletir.
    Yine, [n] -th Recent komutunu -n, örneğin ikinci patla değiştirerek de belirleyebilirsiniz \!-2.

  • |bir boru. Komutun standart çıktısını ("stdout") önceki komutundan sonraki standart komutuna ("stdin") yönlendirir.

  • xselX panolarına erişmek için bir komut satırı aracıdır.
    Daha fazla bilgi için, çevrimiçi olarakManpage simgesi veya çalışan bir sayfa olduğunu okuyun man xsel.

    • -iParametre söyler xselstdin'den okumak için (genellikle bu araçlar klavye girişi, ama biz burada yönlendirme şeye gidiyoruz)
    • -bParametre belirtir panoya yerine X'in "birincil" veya "ikincil" kullanıldığını görelim.

1
Güzel cevap, ama boruyu önleyebilir misin? Güzel lütfen? <<<"!!" xsel -ib
kos

@kos evet, teşekkürler. Bu biraz daha kolaylaştırır. <<<Yapının yeniden nasıl çağrıldığını hatırlamamda yardımcı olabilir misiniz ? Ve bence <<<!!:q xsel -ibdaha iyi (tarihin bang komutunun alıntı yapmasına izin vermek) ya da aynı fikirde değil misiniz?
Byte Komutanı

Ancak !!:qtek tırnak kullanır ( ') ...
Byte Commander

Haklısın, genişleme kullanılarak gerçekleştirilir <<<"!!" xsel -ib. Evet, <<<!!:q xsel -ibdaha iyi, bunun için gidin.
kos

Güzel, xselilginç sözdizimi var
Sergiy Kolodyazhnyy

5

Kullanabilirsiniz xclip:

some_command | xclip -selection c

Yani senin durumunda:

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

c panoya göre duruyor.

xclipİlk önce yüklemeniz gerekebilir :

sudo apt-get install xclip

DÜZENLE:

Sadece yazdığınız komutun (çıktının değil) panoya kopyalanmasını istiyorsanız, Here dizelerini kullanabilirsiniz:

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

Veya bir boru:

echo foobar | xclip -selection c

1
Hala komutların çıktısını alıyorum ama sadece satırın kendisini istiyorum.
Valter Silva

echo "command" | xclip -selection clipboard... Ya da~/.bin : altında bir betiği yapınecho "$@" | xclip -selection clipboard . "Cpy" olarak kaydettiğinizi söyleyin, sonra yapabilirsiniz cpy youtube-dl stuffve idam edilmeden panoya kopyalanacaktır.
Alex

Ve idam edilmesini istiyorsanız ... echo "$@" | xclip -selection c && $@ya da eval ile daha zekice bir şey ...
Alex

@ValterHenrique Lütfen düzenlemelerimi kontrol edin ..
heemayl

3

Bunu yapmak için zshkullandığı küçük bir senaryo yazdım xclip:

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

Bu komut dosyası kabuk / terminalde girilen son komutu sistemin panosuna kopyalar. Tipik bir uzak sunucuda işe yaramaz.

Bu senaryoyu yazmamın birkaç dakika alacağını düşünmüştüm, ancak zshtarihi idare etme yolunda tökezlerken çalışmam için şaşırtıcı derecede uzun sürdü .

Bunlardan tail -n 2ilki sed, bu senaryo için verilen komutun kendisinin tarihe kaydedildiği ve bu nedenle iki satırlık bir geçmişe sahip olduğu ve sonuncusunu da kaldırdığı gerçeğiyle ilgileniyor.

Bu senaryo işe yarıyor ve eğlenceli bir bilmeceydi, ama bunu yapmanın daha basit veya daha zarif bir yolu olup olmadığını merak ediyorum zsh.


Muhtemelen tailve sedkomutlarını bir veya iki komut halinde basitleştirebilirsin . Burada!! açıklanan komutları kullananlar - ZSH'de bulunmalıdır ....
Wilf

Oh, !!gerçekten burada yardımcı olacak gibi görünüyor, teşekkürler!
Alec

0

Pano yöneticisi olarak kullanıyorum.

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

Panoya son komut

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

Çizilmeyi önleyen pano

alias vcb='pbpaste | vimscratch -'

ZSH'ye özgü

# 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

Bu fikirlerin kendi çözümünüzü yaratmanıza yardımcı olabileceğini düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.