Geçerli kabuk komutunu yürütmeden nasıl düzenlerim?


13

"Edit-and-execute-command (Cx Ce)" kullanarak düzenleyicinizi kullanarak bir komutu nasıl düzenleyeceğiniz ve uygulayacağınız hakkında pek çok bilgi var gibi görünüyor, ancak elde etmek istediğim geçerli kabuk komutunu almak, uygulamak belirli filtreleme (bir komut dosyası kullanarak) ve ardından yürütmeden önce daha fazla onay / manuel değişiklik istemi için geri döndürün. Bu bash ile mümkün mü?


Bu sorunun cevabı doğru değil, fakat yerli Bash yerine ZSH terminalini kullanmayı deneyin . Otomatik tamamlama özelliğine sahiptir, bu yüzden komutları hemen çalıştırmayın. Ben bu özel senaryoyu şahsen denedim ve her yaptığımda enter tuşuna basmam gerekiyor edit-and-execute-command.
Praveen Premaratne

1
Benim için çalışan kısayol Escape+ V, ancak yine de komutu yürütecek. Bu nedenle, geçici çözüm için, echokomutu gözden geçirmek üzere konsola yazdırarak yürütmek için ön tarafa ekleyeceğim .
kenorb

2
Somut bir örnek verebilir misiniz? "Belirli filtreleme (bir komut dosyası kullanarak) uygulayın ve sonra istemine geri dön" anlamıyorum.
Kent

3
@PraveenPremaratne: zsh bir terminal değil , kabuk .
Arkadiusz Drabczyk

Yanıtlar:


7

Deneyimlerimle ilgili en son güncelleme

0"+y$ddAşağıdaki eşlemedeki bölüm , dikkatlice düşünmeniz ve zevkinize / iş akışınıza / deneyiminize göre uyarlamanız gereken bir şeydir.

Örneğin, sık sık kendimi arabellek içinde birden çok satır ile sonunda buldum, burada sadece imlecin üzerinde olan yürütmek istiyorum; bu durumda 0"+y$dd:%d<CR>bunun yerine kullanabilirim 0"+y$dd.

Ve bu olası senaryolardan sadece biri.

Sevenler için son cevap vim

Orijinal cevap

Sık sık aynı şeyi yapmam gerekiyor ve bunu aşağıdaki gibi yapıyorum. (Normalde kullanmak set -o viin'i bashkullandığınız takdirde aşağıda noktaları 1 ve 2 farklıdır bu yüzden, set -o emacsbu noktada birleşen, 1 ve 2 noktaları benziyor sorunuzu dayalı; varsayılan Ctrl+ xizledi Ctrl+ eyazmak için zordur, imho .)

  1. vurmak Escapenormal modda olması,
  2. vurmak vkomutu düzenlemek için editör girmek için,
  3. komutu istediğim gibi düzenle,

(Soruyu burada soruyorsunuz.)

  1. vurmak Escape0"+y$dd:wq,
    • Not: 0"+y$değil sadece "+yy, ikincisi de yeni satır kopyalarmış ve bu komut satırında yapıştırarak üzerine komutu yürütülürken neden olacaktır olarak,
  2. panoyu komut satırına yapıştır
    • bunu nasıl yapacağınız kullandığınız terminale bağlıdır, sanırım; Ben çarptı Ctrl+ Alt+ viçinde URxvt.
  3. onaylamaya / manuel düzenlemeye devam et.

Açıkçası bu, tüm komutu silmeden önce düzenlenen komutu panoya kopyalamaktan oluşan bir çözümdür, böylece editörden çıkıldığında hiçbir şey yürütülmez; ancak kendim için alabileceğim en iyisi bu.

Güncelleme

Benim EDITOR(ve VISUAL) eşit olduğu için vim, komutu düzenlediğimde, onu düzenlerim vim.

Bu bağlamda, ben tampon adlı fark etmiş /tmp/bash-fc.randomnerede, random6 karakter alfanümerik rastgele dizedir.

Bu, vimdüzenleyiciniz olarak kullanırsanız .vimrc, tüm diziyi yürütmek için bazı eşleme tanımlayabileceğiniz gibi birçok olasılığa yer verir Escape0"+y$dd:wq. Örneğin, bir komut satırını düzenlerken nadiren kullanacağınız bir komut Leaderd; bu nedenle aşağıdaki mapping'i .vimrcdosyanıza koyabilirsiniz

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

böylece yukarıdaki tarifte 4. adım

  1. isabet EscapeLeaderd

Benim için bu komutları düzenlemenin en iyi yoludur
A.Villegas

2

Bunu Bash / readline'da yapmak mümkün değildir, ancak zsh edit-command-linekomutunda şu komutu kullanarak mümkündür :

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

Şimdi Control- x Control- tuşuna basarak edüzenleyicinizi açın, satırı düzenleyin, düzenleyiciden çıkın - güncellenmiş komut satırını göreceksiniz ancak otomatik olarak yürütülmeyecektir.


1

Şimdi düşündüğüme göre, bir yorumda @kenorb'un önerdiği şeyin bir varyasyonu, (eğer çözüm yok gibi görünüyorsa) en iyi geçici çözümdür, eğer bağlı kalmak istiyorsak bash.

Yapabileceğiniz şey, komut yerine a #(yorum karakteri bash) eklemek echo. Ardından, exitor'dan çıktığınızda, komut etkisiz olacaktır ve sadece tuşuna basmanız arrow up(veya kkullanıyorsanız set -o vi), kaldırmanız #ve onaylamanız gerekecektir .

Bu stratejinin yalnızca birkaç tuş vuruşu eklediğini, bu nedenle yazma seviyenize bağlı olarak oldukça verimli olabileceğini unutmayın.


1

Bu parçalar sizi yakınlaştırabilir:

a) satırsonu satırsonu (ctrl-M) için normal bağlamayı değiştirin bind -x '"\C-M":date"

b) şu anki tarihi geçmişten tutun !#

tarihi istediğiniz komut dosyasıyla değiştirin.

c) elle düzenleme

d) Gerekirse, bir şekilde !!:pyeni komutu komut satırına yazdırdığı, ancak yürütmediği, böylece el ile düzenlemenizi sağlayan kravat .

e) yeni satır yerine ctrl-J gönderilen düzenleme komutunu kullanma

ya da olmayabilir ...


1

Bash'da komutu yürütmeden geçmişten komutu değiştirme seçeneği vardır. Bunun için komut dosyası kullanmak mümkün olduğundan emin değilim, muhtemelen görünmüyor. Bununla birlikte, geçmiş değiştiricileri kullanarak değişiklik yapabilirsiniz.

  1. Değiştirilen komutun yürütülmesini önlemek için histverify seçeneğini etkinleştirin
  2. Son komutu değiştirmek için değiştirici zincirini kullanma
  3. "!!" kullanın Son düzenleme için sonucunuzu komut satırına koymak için

İşte böyle görünüyor:

$ shopt -s histverify
$ ls *.sh
script1.sh  script2.sh  script3.sh  script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh

1

Sizi Bash için Sıkıştırma çerçevesine yönlendirmek istiyorum (ona bağlı değilim): https://github.com/erichs/composure

Sağladığı draftve reviseses onlar yapmaya çalıştığını şeyle yardımcı olabilir gibi o fonksiyonları. İşte projenin benioku dosyasından (uzun) bir alıntı:

Composure, basit kabuk işlevlerini hızlı bir şekilde taslak haline getirmenize, uzun boru filtrelerinizi ve karmaşık komutlarınızı okunabilir ve yeniden kullanılabilir parçalara ayırmanıza yardımcı olur.

Önce taslak, daha sonra sorular sorun

Bir komuta gemini hazırladıktan sonra atma! Kullanın draft ()ve iyi bir isim verin. Bu, son komutunuzu daha sonra tekrar kullanabileceğiniz bir işlev olarak saklar. Bunu kaba bir taslak gibi düşünün.

  $ cat servers.txt
  bashful: up
  doc: down

  up-arrow

  $ cat servers.txt | grep down
  doc: down

  $ draft finddown

  $ finddown | mail -s "down server(s)" admin@here.com

Revize et, revize et, revize et!

Artık minimal bir kabuk fonksiyonuna sahip olduğunuza göre, yeniden düzenleme ve düzeltme yoluyla daha iyi hale getirmek isteyebilirsiniz. revise ()En sevdiğiniz düzenleyicide kabuk işlevinizi gözden geçirmek için komutu kullanın .

  • fonksiyonları giriş parametreleriyle genelleme
  • işlevsellik ekle veya kaldır
  • belgeler için destekleyici meta veriler ekleyin

    $ revise finddown
    finddown ()
    {
      about finds servers marked 'down' in text file
      group admin
      cat $1 | grep down
    }
    
    $ finddown servers.txt
    doc: down

0

En azından bir klavye kısayoluyla mümkün görünmüyor:

$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
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.