Anda tidak bisa hanya tetap sudodi 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, fcbuilt - 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 sudomempertahankan, 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 firstdan lastnomor 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 $0untuk 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: sudoadalah 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; $0hanya 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. fchist