Saya tahu saya bisa menjalankan perintah terakhir di bash, dengan !!
, tetapi bagaimana saya bisa menjalankan baris keluaran terakhir?
Saya sedang memikirkan use case dari output ini:
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
Tetapi saya tidak tahu bagaimana saya bisa menjalankannya. Saya sedang memikirkan sesuatu seperti !!
, mungkin @@
atau serupa?
command_not_found_handle
fungsi shell atau skrip yang dijalankannya (biasanya hanya/usr/lib/command-not-found
). Saya pikir Anda bisa membuatnya sehingga Anda diminta secara interaktif dengan opsi untuk menginstal paket secara otomatis, atau (mungkin lebih baik) sehingga nama paket disimpan di suatu tempat dan dapat diinstal dengan menjalankan perintah singkat. Itu cukup berbeda dari yang Anda tanyakan di sini, Anda dapat mempertimbangkan untuk memposting pertanyaan terpisah tentang hal itu.Jawaban:
Perintah
$(!! |& tail -1)
harus dilakukan:Seperti yang Anda lihat,
sudo apt-get install git
perintah sedang berjalan.EDIT: Hancur
$(!! |& tail -1)
$()
adalahbash
pola substitusi perintahbash
akan memperluas!!
ke perintah yang terakhir dieksekusi|&
bagian itu rumit. Biasanya pipa|
akan mengambil STDOUT dari perintah sisi kiri dan meneruskannya sebagai STDIN ke perintah di sisi kanan|
, dalam kasus Anda perintah sebelumnya mencetak hasilnya pada STDERR sebagai pesan kesalahan. Jadi, melakukan|
tidak akan membantu, kita perlu meneruskan STDOUT dan STDERR (atau hanya STDERR) ke perintah sisi kanan.|&
akan melewati STDOUT dan STDERR baik sebagai STDIN ke perintah sisi kanan. Sebagai alternatif, lebih baik Anda hanya dapat melewati STDERR:tail -1
seperti biasa akan mencetak baris terakhir dari inputnya. Di sini daripada mencetak baris terakhir Anda bisa lebih tepat seperti mencetak baris yang berisiapt-get install
perintah:sumber
TL; DR:
alias @@='$($(fc -ln -1) |& tail -1)'
Fasilitas interaksi sejarah Bash tidak menawarkan mekanisme untuk memeriksa output dari perintah. Shell tidak menyimpannya , dan ekspansi histori khusus untuk perintah yang Anda jalankan sendiri, atau bagian dari perintah itu.
Ini meninggalkan pendekatan rerunning perintah terakhir dan memipatkan stdout dan stderr (
|&
) ke dalam substitusi perintah. Jawaban heemayl mencapai ini, tetapi tidak dapat digunakan dalam alias karena shell melakukan ekspansi sejarah sebelum memperluas alias, dan bukan setelahnya.Saya tidak bisa mendapatkan ekspansi sejarah untuk berfungsi dalam fungsi shell, bahkan dengan mengaktifkannya di fungsi dengan
set -H
. Saya curiga!!
dalam suatu fungsi tidak akan pernah diperluas, dan saya tidak yakin apa yang akan diperluas jika itu terjadi, tetapi saat ini saya tidak yakin persis mengapa tidak.Oleh karena itu, jika Anda ingin mengatur hal-hal sehingga Anda dapat melakukan ini dengan mengetik sangat sedikit, Anda harus menggunakan
fc
shell builtin alih-alih ekspansi sejarah untuk mengekstrak perintah terakhir dari sejarah. Ini memiliki keuntungan tambahan yang berfungsi bahkan ketika ekspansi sejarah dinonaktifkan.Seperti ditunjukkan dalam Gordon Davisson 's jawaban untuk Membuat alias mengandung ekspansi bash sejarah (pada Super User ),
$(fc -ln -1)
mensimulasikan!!
. Memasukkan ini ke dalam!!
dalam perintah heemayl$(!! |& tail -1)
menghasilkan:Ini berfungsi seperti
$(!! |& tail -1)
tetapi dapat masuk dalam definisi alias:Setelah Anda menjalankan definisi itu, atau memasukkannya ke dalam
.bash_aliases
atau.bashrc
dan memulai shell baru, Anda cukup mengetik@@
(atau apa pun yang Anda bernama alias) untuk mencoba untuk mengeksekusi baris terakhir dari output dari perintah terakhir.sumber
./script
, bukan bahwa Anda sumber dengan.
atausource
builtin - Saya tidak yakin. Bash menambahkan ke file saat keluar shell atau ketika Anda menjalankanhistory
dengan-a
atau-w
(lihathelp history
). Jika ya, perintah dalam banyak shell interaktif akan disisipkan (muncul sesuai urutan Anda menjalankannya). Anda dapat segera menambahkannya. . Tapi saya pikir masih banyak yang harus dilakukan untuk membuatfc
naskah. Saya sarankan memposting pertanyaan baru tentang ini. Jika ya, silakan berkomentar di sini dengan tautan ke sana.Jika Anda menggunakan emulator terminal di bawah X, suka
gnome-terminal
,konsole
atauxterm
, Anda dapat menggunakan pilihan X untuk sesuatu seperti salin dan tempel:Gunakan pilihan utama
Pilih seluruh baris untuk dijalankan dengan klik kiri tiga kali lipat .
Kemudian tempel ke baris perintah menggunakan klik tombol tengah .
Ini harus bekerja di sebagian besar emulator terminal. Itu memanfaatkan pemilihan utama, tanpa menyentuh clipboard - mereka terpisah.
Memilih, dan kemudian menggabungkan salin dan tempel dalam satu operasi, secara teknis.
sumber
Seperti yang Eliah Kagan sebutkan , shell tidak menyimpan output perintah. Namun, ada cara untuk mendapatkan baris terakhir output perintah terakhir, tanpa menjalankan perintah lagi , jika Anda menjalankan layar .
Masukkan baris berikut ke Anda
~/.screenrc
:Kemudian Anda dapat menekan Ctrl+ atuntuk memasukkan baris sebelumnya di prompt saat ini. Mungkin untuk membuat ini juga secara otomatis tekan enter, tetapi mungkin ide yang lebih baik untuk memeriksanya sebelum Anda menjalankan dan cukup tekan enter secara manual.
Bagaimana itu bekerja:
register t
mendaftarkan string ke buffer bernamat
. Berikut string yang merupakan urutan kunci.bind t
mengikat ke kunci t(mis. mengeksekusi menggunakan Ctrl+ at),process t
berarti mengevaluasi konten buffer bernamat
.^a[
(= Ctrla[): masuk ke mode salink
naik satu baris ke atas,0
ke awal baris,y$
salin sampai akhir baris, (spasi) selesaikan perintah^a]
(= Ctrla]): rekatkan konten yang disalin^a^L
(= CtrlaCtrlL) segarkan layar (jika tidak, konten yang di-paste tidak akan muncul, karena Anda tidak mengetiknya sendirisumber