Bash komutunda ilk sözcüğü hızlıca nasıl değiştirebilirim?


44

Bash ile iş akışımı biraz geliştirmek istiyorum ve aynı komutu farklı bir çalıştırılabilir dosyada çalıştırmak istediğimi fark ediyorum.

Bazı örnekler:

Git (ikinci kelimeyi hızlıca değiştirmek istiyorum):

git diff     foo/bar.c
git checkout foo/bar.c

Cat / rm (sadece ilk kelimenin değişmesi gereken yer):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

İlk sözcüğü kaldırmak için Ctrl+ atuşuna basabileceğimi biliyorum Del, ancak bunu yapmanın daha hızlı bir yolu olup olmadığını merak ediyorum.



Dürüst olmak gerekirse, Ctrl + a tuşlarını kullanmanın ve silmenin en güvenli olduğunu düşünüyorum. Kesinlikle çok yavaş değil.
agweber,

Yanıtlar:


56

!$ önceki komutunuzun son kelimesine genişler.

Yani yapabilirsin:

cat foo/is/a/very/long/path/to/bar.c

rm !$

veya:

git diff foo/bar.c

git checkout !$

Örneklerin sadece son kelimeyi tekrar etti, bu yüzden !$iyi çalıştı. Gerçekte tekrarlamak istediğiniz birçok argümanınız varsa ve ilk kelimeyi değiştirmek istemeniz !*durumunda, sıfırın dışında bir önceki komutun tüm kelimelerine genişleyen kullanabilirsiniz .

bashMan sayfasının "TARİHİ GENİŞLETME" bölümüne bakın. Orada çok fazla esneklik var.


16
Doğru ve uygun. Ben koymak sadece istiyorum uyarıyı : ile !$sahip Çalıştırdığınız çizginin hiçbir tam bir görsel kontrol . Bu bazen zararlı olabilir. Özellikle bir yanlış ize maruz kalırsanız. Bu aldığı historygenişletmek ne. Dolayısıyla, son komutu başında boş bir boşlukla yazarsanız, muhtemelen bu komut geçmişte bitmeyecektir. Yeni komutunuzu !$kabuk ile çalıştırdığınızda , parametreleri yazılan son komut satırından değil, yalnızca geçmişin sonundan alır. İşte aynı daha fazla kelime.
Hastur,

1
@Hastur Kazaları önlemek için kabuğunuzu sekmede veya girişte geçmişi genişletecek şekilde ayarlayabilirsiniz.
Ocak'ta

2
@Hastur, bu yüzden zsh'de iki kez intro basmanız gerekir (utanmaz promosyon)
Braiam

@Hastur - Neler olacağına dair herhangi bir şüphem olduğunda veya uzun süre önce yazmış olduğum uzun bir şey çalıştırmadan önce ilk önce başka bir şey yapmam gerektiğini fark ettiğimde, satırın başına gidip bir #veya echo daha onu görün ve tarihe gider, böylece geri alabilirim ve devre dışı bırakma öneki olmadan tekrar çalıştırabilirim.
Joe

28

Ctrl+ aSonra, satırın başına gitmek için Alt+ dilk kelimesini silin.


9
Silme sözcüğü kısayolu aslında Meta + d'dir ve Meta, Linux makinelerinde Alt ile eşleştirilir. Bunun olmadığı platformlarda Meta değiştiriciyi elde etmenin bir alternatifi Escape'i önek olarak kullanmaktır. Bkz en.wikipedia.org/wiki/Meta_key
Gustavo Giráldez

2
@ GustavoGiráldez Eğer derin gitmek istiyorsanız, o Meta+Dzaman sadece emacsetkinleştirilmişse geçerlidir ( set -o emacsvarsayılan olarak veya yoluyla ). Bu işe yaramaz alt düzenleyici -biçem veya eğer emacsdevre dışı bırakılır.
TC1

Birçok terminalde (çünkü bu bir terminal olayıdır ve Bash meselesi değildir), ev anahtarı aynı zamanda bir hattın başlangıcına gider. Dizüstü bilgisayarların çoğu, Fn + Left tuşlarını ana tuşa eşler. Benzer şekilde, bitirme tuşu genellikle satırın sonuna gider. Henüz bu kısayol tuşlarını desteklemeyen bir terminal emülatörü kullandım.
Kat

1
@Mike Öte yandan, C-ave M-delleriniz zaten yazma konumundaysa, yazmak için çok daha hızlıdır.
jjlin

@Mike Bu çok sert bir şey. Yazın catve Ev (basıldığında ne olsun karşılaştırmak ^[[Hburada) ve pres Ctrl + a ( ^A).
Jonas Schäfer

17

Aslında daha hızlı olup olmayacağından emin değilim, ancak özellikle # .3 numaralı maddeye bakın :

  1. ^ Str1 ^ str2 ^ kullanarak önceki komuttan bir dize değiştirin.

Aşağıdaki örnekte, önce bir dosyayı doğrulamak için ls komutunu yürüttük. Daha sonra dosyanın içeriğini görüntülemek istediğimizi fark ettik. Tüm dosya adını tekrar yazmak yerine, önceki komuttaki “ls” yi aşağıda gösterildiği gibi “cat” ile değiştirebiliriz.

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

15

Alt+.

Yalnızca önceki komutlardan birinin son bölümünü tekrarlamanız gerekirse , tarihin son satırından alınan son argümanı yapıştıracak Alt+ kullanabilirsiniz ..

Birden fazla defa basılırsa, daha önce satırın son argümanı ile yapıştırılanların yerine geçecektir ...

Örneğin, eğer son 2 komut şuysa:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

Kabuğuna yazıyorum rmve Alt+ 'a .basıyorum:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

tekrar basarsam Alt+ .bunun yerine belirir

rm foo/is/a/very/long/path/to/bar.c

ve bunun gibi...


Neden olduğundan emin değilim, ancak bu Mac konsolumda çalışmıyor.
lulalala

Burada çalıştığı bilinen klavye kısayolları var bash. BTW bash'ı kabuk olarak kullandığınızdan emin misiniz ?
Hastur

1
Sanırım bu bir Mac olayı. Ben
yazdığımda


12

@Jjlin cevabına ek olarak, aşağıdaki ipuçlarıyla ilginizi çekebilir:

  • Ctrl+ wsoldaki kelimeyi siler
  • Ctrl+ kimleçten komut satırının sonuna kadar siler
  • Ctrl+ uimleçten komut satırının başlangıcına kadar siler
  • Alt+ bimleci bir sözcük geriye doğru hareket ettirir
  • Alt+ fimleci bir sözcük ileri oynatır
  • $_ önceki komut satırının son argümanını içerir

Bunlar hakkında daha fazla bilgi için bashkılavuzun "Readline Komut İsimleri" bölümüne bakın .

Örneğin:

cat foo/is/a/very/long/path/to/bar.c
rm $_

Bunlar güzel ipuçları, ama soruyu cevaplamıyorlar.
slhck

@slhck IMHO bunu çünkü soru başlığı verilen örneklerle uyuşmuyor. Örneklere odaklanırsak, yaptığım gibi, başlık "Bir bash komutunda bir kelimeyi hızlı bir şekilde nasıl değiştirebilirim?" Olmalıdır. . Bu yüzden de cevabım "jjlin'e ek olarak" dır. Ama sanırım soru açıklığa kavuşturulmalı.
maiki,

OP her zaman komuttaki ilk nsözcükleri n = 1, ilk örnekte ve n = 2ikincisinde silmek ister (değiş tokuş eder) . jjlin'in cevabı, ilk kelimenin nasıl silineceğini gösterir (ve kısayolu yeniden uygulayarak, nkelimelere kadar silin ). Cevabınız birkaç Bash kısayolunu (gerçekten yararlı olan) listeler, ancak hiçbiri ilk nkelimeleri silmek için etkili yollar değildir .
Ocak'ta

Hm, tekrar okumak, $_parametre yalnızca bir argüman varsa (yani toplam argüman sayısı n = m - 1nerede mise) işe yarayacaktır . Kısayolların geri kalanı, yine de soru ile alakasız.
slhck

@slhck Tartışma uğruna ilk örneği "2. kelimeyi değiştir" olarak okudum :-)
maiki

8

Vi konusunda uzmansanız, komutu kullanarak vi bültenlerini bash'ta (çoğu mermi mi?) Etkinleştirebilirsiniz set -o vi. Ardından, komutunuzu düzenlemek için normal vi tuşlarını kullanabilirsiniz. İlk örneğinizde ^wcw"diff" silmek, sonra ödeme yapmak için değiştirebilirsiniz.

Yalnızca komut satırını düzenlemek için vi anahtar bağlarını öğrenmeye değmeyebilir, ancak bunları zaten biliyorsanız, düzgün bir verimlilik artırıcısıdır.


Kornshell'i öğrendim set -o vi, nasıl yaşadım? Bunu bile benim bash komutlarımda yapıyorum.
bgStack15

bindkey -vzsh için. Esc 0 c w
user530873,

6

Bu kediyi ciltlemek için birçok yol var!

Belirli bir dize değiştirmek için ^old^new^extra, önceki komutu almak yerine geçecek oldolan newve ekleme yapılması extra. İstediğiniz kadar erken durabilirsiniz; Örneğin , boş dize ile ^olddeğiştirilecek oldve boş dize ekleyecektir (temelde olddaha fazla şey silme ve yapma)

1. ^diff^checkout
2. ^cat^rm

Bunun özellikle yararlı bir çeşidi:

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

Belirli bir sözcüğü değiştirmek için, kullanabilirsiniz !m:n-pkelimeleri ifade etmek için niçinden pkomuta m(şimdiki komutundan geri saymaya kullanım negatif sayılar). Sen atlayabilirsiniz -pparçası tek bir kelime ifade etmek ve ihmal :m-pbütün bir komuta başvurmak için rol. Özel formlar !!için !-1, !$önceki komuta son kelime için, ve !*argümanlar (tüm ama kelime için 0önceki komuta) oldukça kullanışlıdır.

1. !!:0 checkout !!:2-
2. rm !*

Bunların her ikisini de sıklıkla kullanırım; zsh özellikle güzel, çünkü isabet sekmesi doğru yaptığınızdan emin olmak için kriptik malzemeyi genişletecek.

Bunu satır düzenlemeyle yapmanın pek çok yolu var. Kabuğunuzun anahtar kelimelerini okuyun.


-2

Çoğu terminal programı destekliyor ...

  • <Up-Arrow>Geçmişden önceki komut satırlarından birini yeniden görüntülemek için gerektiği kadar basın .
    • <Down-Arrow>Geçmiş listesinde ileri gitmek için tuşuna basın .
  • <Left-Arrow>İmleci ikinci kelimenin sonuna getirmek için gerektiği kadar basın .
  • <Backspace>İkinci sözcüğü silmek için gerektiği şekilde basın .
  • İkinci sözcüğü yazın.
    • Daha fazla değişiklik yapmak için yeniden konumlandırmak için <Right-Arrow>/ düğmesine basın <Left-Arrow>.
  • Hit <RETURN>komutu çalıştırmak için

İstediğiniz komut satırı yeni değilse, <Ctrl-r>soruda açıklandığı şekilde bir ters-i-araması yapın ...
Komutun bir kısmını bash yazdıktan sonra ctrl-r'yi kullanmanın bir yolu var mı?
Daha sonra gerektiğinde ok tuşlarıyla düzenleyin.


-3

Ne yapıyorum (Ubuntu / bash):

1) Arrow uphey, önceki komutu geri almak için
2) en Homebaşa dönmek için tuşu
3) Gerektiği gibi komutu değiştirin.

Idiot-proof ve özellikle çok satırlı komutlar için kullanışlıdır.

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.