Sadece sudo
bir 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 fc
yerleş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 first
ve last
sayısı geçirilecek fc
bası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: sudo
potansiyel 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
; $0
yalnı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. fc
hist