Komut satırında kuyruktan metin yürütmenin en kolay yolu nedir?


10

Bazen yeni (ubuntu) bir kutu üzerinde çalışıyorum ve yazıyorum gitve uyarıldım:

The program 'git' is currently not installed.  You can install it by typing:
apt-get install git-core

Böyle bir şey olursa, son satırı aşağıdaki gibi yakalayabileceğimi biliyorum:

!! 2>&1 | tail -n 1

Ancak bunun ( apt-get install git-core) sonucunu en kolay nasıl yürütebilirim ?

Yapabileceğimin farkındayım

`!! 2>&1 | tail -n 1`

ancak çıktıyı gerçekten borulamanın ve çalıştırmanın bir yolu var mı? Bu işe yaramaz gibi görünüyor:

!! 2>&1 | tail -n 1 | sh

Ayrıca 2>&1bölüm biraz hantal, bu yüzden bunu yapmanın daha kolay bir yolu olup olmadığını merak ediyorum.

Düzenle

Bunu bir şekilde bir değişkene kaydetmek ve daha sonra değişkeni yürütmek de kabul edilebilir:

!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd

Ama stdouten azından değişkenin komutun sağ tarafında olmasıyla, bir değişkene geçmenin bir yolunu bildiğimden emin değilim .

Yanıtlar:


8

Sistem bash'ınızda bulunmayan bir komut yazdığınızda işlev çalışır command_not_found_handle(). Bu işlevde, /usr/lib/command-not-foundiletileri yazdıran bir komut dosyası çağrısı vardır .

Ubuntu 12.04

Bu senaryonun değişim kaynağına Benim ilk tahminim iletileri yazdırmak için stdoutyerine stderr, ama senaryo I okuyordum kaynak size paketi eksik yüklemek istiyorsanız sadece sormak yapılandırabilirsiniz bulundu.

Değişkeni dışa aktarırsanız COMMAND_NOT_FOUND_INSTALL_PROMPT, eksik paketi yüklemeniz istenir:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm: 

Eski Ubuntu sürümleri

Ne yazık ki COMMAND_NOT_FOUND_INSTALL_PROMPTbaşka birkaç seçenek bulabilmek için hayır :

1) 12.04'ten paketi yükleyin - sorun olmamalı - Python'da sadece birkaç komut dosyası var, bu yüzden çalışmalı (denenmemiş!).

2) Değişim stderriçin stdout. O düzenlemek dosyasını yapmak için /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pyve değişim stderriçin stdouthatlar 237 ve 240 yılında.

Bundan sonra bu şekilde kullanabilirsiniz:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins

237 ve 240 satırlarında komut verme -yseçeneği eklerseniz apt-getsözdizimini de kullanabilirsiniz !! | sh.

3) Bu betiği 242 satırından şu şekilde de değiştirebilirsiniz:

print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()

Bu şekilde komutunuzu dosyaya alırsınız ~/.install-missing, böylece takma ad oluşturabilirsiniz:

alias im="chmod +x ~/.install-missing; ~/.install-missing"

Aradığınızda impaket yüklenecektir.


Hmm, bu gerçekten iyi görünüyordu ama aslında 11.10 oneiric üzerinde çalışmıyor gibi görünüyor, /usr/lib/command-not-foundama COMMAND_NOT_FOUND_INSTALL_PROMPT- düşünceleri referans yok ?
cwd

Tamam, bu 12.04 hassas bir parçası olacak gibi görünüyor, ( package-import.ubuntu.com/diffs/command-not-found ). Sanırım önceki sürümler için hala bir çözüme ihtiyacım var.
cwd

@cwd: Ben cevabım ... güncellenen
PBM

3

Şununla doğru yoldaydınız:

!! 2>&1 | tail -n 1 | sh

... ama sh yapma seçeneğini kaçırıyorsunuz . Düşünmek:

!! 2>&1 | tail -n 1 | sh -s

Ve apt-get'i çalıştırmak için muhtemelen root erişimine ihtiyacınız olduğundan, şunları göz önünde bulundurun:

!! 2>&1 | tail -n 1 | sudo sh -s

Bu işe yaramıyor. sh ve sh -s aynı şeyi yapar, en azından bu durumda.
Deepak Mittal

1

Bunun gibi bir şey yapabilirsiniz:

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

Etkileşimli programlar, bu durumda 'Y' girişi beklediğinden, borularla iyi çalışmıyor gibi görünüyor, ancak ilk komut biter bitmez stdin dosya tanıtıcısı kapanıyor.


0

Bir değişken evalve inanıyorum komut ikamesi kullanabilirsiniz (gerçi her şeyin ne kadar güvenli olacağından emin değilim):

TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR

Yukarıdakilerle yanlış kanıtlanmaya hazırım. Bunu bir Red Hat makinesinde echobash tamamlama otomatik önerisi yerine bir komutla test ediyorum , ancak prensip aynı olmalı.

Günün sonunda, sadece yetenek yüklemek git git daha hızlı olurdu ...

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.