Misalnya jika saya ingin membuat file dan memasukkan teks dalam satu baris, saya dapat mengarahkan output ke file dengan menggunakan >
operator:
echo "something" > /path/foobar
tetapi jika saya tidak memiliki akses ke folder /path/
dan perlu hak sudo, Bagaimana saya bisa mencapai perintah yang sama seperti pengguna biasa dengan hak sudo?
Saya mencoba
sudo echo "something" > /path/foobar
tapi itu tidak berhasil, karena sudo hanya dihitung untuk edit
tetapi tidak untuk bagian kanan
dari >
Tentu, saya bisa menjadi root sebelumnya dengan sudo su
atau gunakan tee
sebagai gantinya:
echo "something" | sudo tee /path/foobar
Tetapi saya ingin menemukan solusi di mana saya dapat bekerja dengan baris terakhir sebagai pengganti melalui
sudo !!
Apakah tidak ada cara untuk "mendaur ulang" baris terakhir dan cukup tambahkan sudo
di depan?
Jawaban yang Diterima:
Anda tidak bisa hanya menempelkan 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 itu
sudo bash -c !!
kecuali bahwa ini tidak berhasil, karena !!
interpolasi teks dari perintah sebelumnya, karakter khusus dan semua. Anda perlu mengambil teks perintah sebagai string dan meneruskannya sebagai argumen ke sh
. Untungnya, fc
bash bawaan memungkinkan Anda melakukannya¹.
sudo bash -c "$(fc -ln -1)"
Atau bahkan, untuk memastikan untuk menjalankan versi bash yang sama yang sedang berjalan:
sudo "$BASH" -c "$(fc -ln -1)"
Perhatikan bahwa karena perintah dijalankan dalam proses shell yang terpisah, ia mewarisi variabel lingkungan (hanya yang sudo
mempertahankan, pikiran), tetapi tidak shell variabel internal. Opsi shell (mis. kshglob
) dan setelan lainnya juga akan dimulai dari default.
Perintah² yang sama bekerja di zsh dan ksh, meskipun ATT ksh93 membutuhkan keduanya first
dan last
nomor yang akan diteruskan ke fc
(yang juga berfungsi 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 shell yang sedang berjalan hanya berfungsi jika shell dipanggil melalui $PATH dan $PATH tidak berubah, atau melalui jalur absolut.
Inilah metode lain di zsh yang sedikit lebih jelas tetapi lebih lama:
sudo zsh -c $history[$[HISTCMD-1]]
Kata peringatan terakhir:sudo
adalah untuk perintah yang berpotensi berbahaya. Jangan terlalu mudah menggunakannya!
Ada beberapa spasi ekstra di awal dan substitusi perintah menghapus baris baru di akhir, tetapi sintaks shell tidak peduli tentang itu.
² Saya tidak berpikir zsh atau ksh memiliki sesuatu seperti $BASH
bash; $0
hanya berfungsi ketika itu adalah jalur absolut, atau saat tidak mengandung garis miring dan jalur pencarian perintah tidak berubah.
fc
adalah alias untuk hist
di ATT ksh tapi itu sama baiknya.