Sadece sudobir kabuk komutunun önüne yapıştıramazsınız , bu komutu tekrar değerlendirmek için bir kabuk çağırmanız gerekir (değişkenleri genişletmek, yeniden yönlendirme operatörleri için dosyaları açmak, vb.). Yani bu
sudo bash -c !!
Bunun dışında pek çalışmaz, çünkü !!önceki komutun metnini, özel karakterleri ve hepsini enterpolasyon yapar . Komut metnini bir dize olarak almanız ve bunu bir argüman olarak iletmeniz gerekir sh. Neyse ki, bash'ın fcyerleşik yapısı bunu yapmanıza izin veriyor¹.
sudo bash -c "$(fc -ln -1)"
Hatta şu anda çalışan bash sürümünün aynı olduğundan emin olmak için:
sudo "$BASH" -c "$(fc -ln -1)"
Komutun ayrı bir kabuk işleminde yürütüldüğünden, ortam değişkenlerini (sadece koruyanları dikkate alarak) devraldığını sudo, ancak iç değişkenleri kabuk almadığını unutmayın. Kabuk seçenekleri (örneğin kshglob) ve diğer ayarlar da varsayılandan başlayacaktır.
ATT ksh93 hem de gerektirir ama aynı command², zsh ve ksh çalışır firstve lastsayısı geçirilecek fcbasınız → (aynı zamanda bash çalıştığı, zsh ve pdksh / mksh):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
$0Çalışan kabuğun çalıştırılabilirini tanımlamak için kullanmak , yalnızca kabuk $ PATH aracılığıyla ve $ PATH değişmemişse veya mutlak bir yol boyunca çalıştırıldığında çalışır.
İşte biraz daha net ama daha uzun olan zsh içindeki başka bir yöntem:
sudo zsh -c $history[$[HISTCMD-1]]
Son bir uyarı kelimesi: sudopotansiyel olarak tehlikeli komutlar içindir. Kullanımı çok kolay hale getirme!
¹ Orada bazı ekstra boşluk başında bulunuyor ve komut ikamesi sonunda yeni satır kapalı şeritler, fakat kabuğun sözdizimi bu umurumda değil.
² zsh ya da ksh'ın bash gibi bir şeye sahip olduğunu sanmıyorum $BASH; $0yalnızca mutlak bir yol olduğunda veya eğik çizgi içermediğinde ve komut arama yolu değişmediğinde çalışır.
T ATT ksh için bir takma addır, ancak bu kadar iyidir. fchist