Anda tidak bisa hanya tetap sudo
di depan perintah shell, Anda harus memanggil shell untuk mengevaluasi perintah itu lagi (melakukan hal-hal seperti memperluas variabel, membuka file untuk operator pengalihan, dll.). Jadi begitu
sudo bash -c !!
kecuali bahwa ini tidak cukup berhasil, karena !!
menyisipkan teks dari perintah sebelumnya, karakter khusus dan semua Anda perlu mengambil teks perintah sebagai string dan meneruskannya sebagai argumen sh
. Untungnya, fc
built - in bash memungkinkan Anda melakukan itu¹.
sudo bash -c "$(fc -ln -1)"
Atau bahkan, untuk memastikan untuk menggunakan versi bash yang sama yang sedang berjalan:
sudo "$BASH" -c "$(fc -ln -1)"
Perhatikan bahwa karena perintah dieksekusi dalam proses shell terpisah, itu mewarisi variabel lingkungan (hanya yang sudo
mempertahankan, pikiran), tetapi tidak shell variabel internal. Opsi shell (mis. kshglob
) Dan pengaturan lain akan mulai dari default juga.
Perintah yang sama² bekerja di zsh dan ksh, meskipun ATT ksh93 membutuhkan keduanya first
dan last
nomor untuk diteruskan ke fc
³ (yang juga bekerja di bash, zsh dan pdksh / mksh):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
Menggunakan $0
untuk menunjuk executable dari running shell hanya berfungsi jika shell dipanggil melalui $ PATH dan $ PATH belum berubah, atau melalui path absolut.
Berikut metode lain dalam zsh yang sedikit lebih jelas tetapi lebih lama:
sudo zsh -c $history[$[HISTCMD-1]]
Kata terakhir dari peringatan: sudo
adalah untuk perintah yang berpotensi berbahaya. Jangan membuatnya terlalu mudah untuk digunakan!
¹ Ada beberapa spasi putih di awal dan substitusi perintah menghilangkan baris baru di akhir, tetapi sintaksis shell tidak peduli tentang itu.
² Saya tidak berpikir zsh atau ksh memiliki sesuatu seperti bash $BASH
; $0
hanya berfungsi saat ini merupakan path absolut, atau ketika tidak mengandung garis miring dan jalur pencarian perintah belum berubah.
³ adalah alias untuk di ATT ksh tapi itu sama baiknya. fc
hist