Apa cara termudah untuk mengeksekusi teks dari ekor di baris perintah?

10

Terkadang saya mengerjakan kotak (ubuntu) baru dan saya mengetik gitdan diberi tahu:

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

Jika itu terjadi, saya tahu bahwa saya dapat mengambil baris terakhir dengan melakukan sesuatu seperti:

!! 2>&1 | tail -n 1

Tetapi bagaimana saya bisa mengeksekusi hasil itu ( apt-get install git-core) paling mudah?

Saya sadar saya bisa melakukannya

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

tetapi apakah ada juga cara untuk benar-benar menyalurkan output dan menjalankannya? Ini sepertinya tidak berhasil:

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

Juga 2>&1bagian ini sedikit rumit jadi saya akan penasaran jika ada cara yang lebih mudah untuk mewujudkannya juga.

Edit

Juga dapat diterima untuk menyimpan ini ke suatu variabel, dan kemudian jalankan variabel:

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

Tapi saya tidak yakin saya tahu cara memasukkan pipa stdoutke variabel juga, setidaknya tidak dengan variabel berada di sisi kanan perintah.

cwd
sumber

Jawaban:

8

Ketika Anda mengetik perintah yang tidak ada di sistem Anda menjalankan fungsi bash command_not_found_handle(). Dalam fungsi ini ada panggilan ke /usr/lib/command-not-foundskrip yang mencetak pesan.

Ubuntu 12.04

Dugaan pertama saya ke sumber perubahan script ini untuk mencetak pesan ke stdoutgantinya stderr, tapi ketika saya membaca sumber naskah saya menemukan bahwa Anda bisa mengkonfigurasinya untuk hanya meminta Anda jika Anda ingin menginstal paket hilang.

Jika Anda mengekspor variabel, COMMAND_NOT_FOUND_INSTALL_PROMPTAnda akan diminta untuk menginstal paket yang hilang:

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: 

Versi Ubuntu yang lebih lama

Sayangnya tidak ada COMMAND_NOT_FOUND_INSTALL_PROMPTsehingga saya dapat menemukan beberapa opsi lain:

1) Instal paket dari 12.04 - seharusnya tidak menjadi masalah - hanya beberapa skrip di Python yang seharusnya bekerja (belum diuji!).

2) Ubah stderrke stdout. Untuk melakukannya edit file /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pydan ubah stderrke stdoutdalam baris 237 dan 240.

Setelah itu Anda bisa menggunakannya dengan cara ini:

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

Jika Anda menambahkan -yopsi ke apt-getperintah di baris 237 dan 240 Anda juga bisa menggunakan sintaks !! | sh.

3) Anda juga dapat memodifikasi skrip ini dari baris 242 dengan cara ini:

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()

Dengan cara ini Anda akan mendapatkan perintah dalam file ~/.install-missing, sehingga Anda dapat membuat alias:

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

Jika Anda memanggil impaket akan diinstal.

pbm
sumber
Hmm, ini terlihat sangat bagus tetapi sebenarnya tidak bekerja pada 11.10 oneiric, /usr/lib/command-not-foundtetapi tidak memiliki referensi ke COMMAND_NOT_FOUND_INSTALL_PROMPT- pikiran?
cwd
Ok, sepertinya ini adalah fitur yang akan menjadi bagian dari 12,04 tepat, ( package-import.ubuntu.com/diffs/command-not-found ). Saya kira saya masih membutuhkan solusi untuk versi sebelumnya.
cwd
@ cwd: Saya memperbarui jawaban saya ...
pbm
3

Anda berada di jalur yang benar dengan:

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

... tetapi Anda melewatkan opsi untuk sh . Mempertimbangkan:

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

Dan karena Anda mungkin memerlukan akses root untuk menjalankan apt-get, pertimbangkan:

!! 2>&1 | tail -n 1 | sudo sh -s
ctt
sumber
Ini tidak berhasil. sh dan sh -s melakukan hal yang sama, setidaknya dalam kasus ini.
Deepak Mittal
1

Anda dapat melakukan sesuatu seperti ini:

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

Program interaktif tampaknya tidak berfungsi dengan baik dengan pemipaan karena mengharapkan input, 'Y' dalam kasus ini, tetapi deskriptor file stdin ditutup segera setelah perintah pertama selesai.

Deepak Mittal
sumber
0

Anda dapat menggunakan variabel, evaldan memerintahkan substitusi yang saya percayai (meskipun saya tidak yakin seberapa aman semua ini):

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

Saya bersedia terbukti salah dengan hal di atas. Saya menguji ini pada mesin Red Hat dengan echoperintah daripada menyarankan penyelesaian bash otomatis tetapi prinsipnya harus sama.

Pada akhirnya, akan lebih cepat untuk hanya mengetik aptitude install git ...

webtoe
sumber