Aynı komutu tekrar çalıştırın, ancak root olarak çalıştırın.


117

Bazen bir komut çalıştırdığımda, yeterli izne sahip olmak için onu süper kullanıcı olarak çalıştırmam gerektiğini fark etmiyorum.

Aynı komutu tekrar çalıştırmak için ancak süper kullanıcı olarak bir yolu var mı?

Yanıtlar:


196

En basit yol koşmaktır:

sudo !!

Bu son komutu ancak süper kullanıcı olarak çalıştırır.

Kaynak .


5
Bunu oldukça yararlı buldum ve daha önce karşılaşmamıştım (genel bilgi olsa da). Sitede bulamadım, bu yüzden kendim cevaplayacağımı düşündüm.
Trufa

30
Bir kenara, !!tek başına yürütmek, önceki komutunuzu kaydedildiği gibi çalıştırır history. Ek olarak, yapmak !-1, !-2vb. Son komutunuzu, ikinci son komutunuzu vb. Çalıştırır. Kullanışlı!
oaskamay

6
Başka bir yana, bu başlangıçtan !<command>son olayı ~/.bash_historybaşlatacak<command>
Radu Rădeanu

1
ctrl-r de çok kullanışlıdır. yazdıklarınızla eşleşen komutlar için geçmişinizde geriye doğru arama yapar. Bu, yeniden çalıştırmadan önce komutu düzenlemenize izin verir
KayEss

4
!Kopyalanan bu aptal bash olayı, tcshher zamankinden daha fazla beni mahvetti. Çift tırnak, yorumundan korunmaz !. $ foo "!bar"-> !bar: event not found.
Kaz,

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​görüntü tanımını buraya girin

cevap :sudo !! önceki komutu tekrar artan ayrıcalıklarla tekrarlamak için doğrudan girersiniz .

düzenleme: reddit yoluyla bulunan görüntü , ve Randall Munroe tarafından orijinal xkcd çizgi roman bir parodisi .


3
lütfen burada yorumlarda yanlısı ya da karşıtı bir konuşma yapmayın. Esasları görüşmek istiyorsanız veya başka türlü, lütfen Meta kullanın. Teşekkürler.
fossfreedom

17

Eski komutlarınız arasında gezinmek ve yeniden yazmak / değiştirmek ve sudoönüne eklemek için yukarı ok tuşunu deneyebilirsiniz . (ok tuşlarının üzerindeki ana sayfa düğmesi konumu başlangıcına ayarlar.)

sudo !!Fikirden hoşlanmıyorum , çünkü bazen aralarına başka bir komut ekliyorsunuz ve artık hatırlamıyorsunuz.


1
Neyse ki, yaptığınız zaman sudo !!, kabuk genişleyecektir, !!böylece hangi komutu çalıştırmaya çalıştığını görebilirsiniz. Bu nedenle, Ctrl-C'ye basıp doğru komutu bulmak rahatsız edici olabilir, ama en azından sizi habersiz almayacak.
Reid 21

4
@Reid O kadar genişlemez sonra Enter'a ve tekrar şifre girmek zorunda kalmamasıdır pencere içinde iseniz, bu onay olmadan çalışacaktır. +1'i kör kullanmak yerine kullanmak için + 1'e!!
Izkata

5
@ İzkata: Sanırım bu doğru. Ben zsh kullandım, bu yüzden sadece yazın sudo !!<TAB>ve otomatik !!olarak benim için tamamlandı. Bash M-^(benim için alt + shift + 6) ile tarihi genişletebilir , ancak bu daha az akıcı (buna rağmen yeniden adlandırabilirsiniz). Ayrıca, shopt -s histverifytarih genişlemesi kullandığınızda ve enter tuşuna basarsanız, bunun yerine onu görmenizi / düzenlemenizi sağlamak için gerçekleştirilen genişlemeyle birlikte başka bir bilgi istemi satırı verir.
Reid

1
Komutu yazdığım durumu daha fazla düşünüyordum, komut bu izni reddetti ve geri döndü. Bu aynı komutu tekrar çalıştırmak istediğimi biliyorum ama sudo olarak, basma, evlendirme, sudo yazmak ve çok şey hissetmek istiyorum. bana daha yavaş. Bu sonsuza dek yaptığım ve yetersiz hissettirdiğim yol.
Trufa

@Reid: shopt -s histverifytek bir bit yardımcı olmaz. Çoğu insan Enteriki kere vurmaya alışır. Bu noktada, ne olduğunu kontrol etmek için hala çok geç kaldılar.
Frank Kusters,

13

Ben sadece bir alternatif ekleyeceğim: yazarken kısasudo !! ve daha esnek:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

Bu aynı tuşa basma sayısıyla aynıdır ("ctrl + A" yı bir tanesini sayıyorum ...), ancak "yukarı ok" ekleyerek geçmişinizde hangi komutu koyarsanız yapabilirsiniz.


1
ctrl + A, emacs bağlayıcılarındandır, vi vi bağlayıcılarını da kullanabilirsiniz ( set -o vi). Sonra Escape (komut moduna gidin) ve sonra 'I' (büyük harf 'i', satırın başına ekleyin).
Gerhard Burger

1
@GerhardBurger: Biliyorum, ama tuhaf bir şekilde, çok satırlı belgelerin düzenlenmesi için vi'yi (özellikle vim) seviyorum , ancak kabuktaki bağlayıcı emakları tercih ediyorum (kabuktan komuttan düzenleme moduna geçmek zorunda değilsin) Gerçekten mantıklı, imo ve emacs kısayolları günlük kullanım için, daha az güçlü olsa bile, oldukça yeterli)
Olivier Dulac

Doğru, sadece bütünlüğü sağlamak için ekledim, benim için aynı, ancak '/' ile çok uygun bir şekilde arama yapıyorum;)
Gerhard Burger

@GerhardBurger: vi modunun "/" hakkında, düzenli (emacs bağlayıcı) bash, birkaç komut yazdıktan sonra 'ctrl + r' yazana kadar önceki komutları bulmak için de çok kullanışlı bir yol sunar
Olivier Dulac

7

Bunu yapmanın birkaç yolu var

  • Sadece komuttan sudoönce tekrar ekleyerek komutu girin

  • Up arrowSon komutu almak ve sudoönüne koymak için tuşuna basın .

  • Giriş sudo !!

!!Geçen etmek genişlediğinde komutu girdi. Burada görmek komut satırı geçmişi ile diğer şeyler ile benzer şeyler yapabilirsiniz


7

Bu soru, " Aynı komutu çalıştır, ancak bazı modifikasyonlarla çalıştır " olarak genelleştirilebilirdi , çünkü Unix'teki mükemmel tasarım kararlarından biri, kabuğa bir kez uygulananların, kabuğundan herhangi bir komut tarafından çalıştırılanlardan yararlanabileceğidir.

Başka bir deyişle, bu numara sadece aşağıdakilere uygulanmaz sudo:

  • Önceki komutu superuser ( sudo !!) olarak tekrarlayın
  • Önceki komutu tekrarla ve zamanla ( time !!)
  • Önceki komutu farklı bir ortamla tekrarla ( env A=b B=z !!)
  • Önceki komutu tekrarla ( !!)

Tarihçe genişletme (geçmiş değiştirme olarak da bilinir), önceki komutları tekrar etmeyi kolaylaştıran (daha az tuş vuruşuyla) yalnızca bir kabuk özelliğidir. Kabuk adam sayfanızı kontrol edin history expansion. Örneğin tarihle yapabileceğiniz daha birçok püf noktası ve kısayol tarif eder:

Önceki komutlara numaradan bakabilirsiniz:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Tek tek kelimelere önceki komutlarda başvurabilirsiniz:

some-command !$     # run some-command on the last arg of previous command

Tekrarlamadan önce de arama yapabilirsiniz:

!?awk               # repeat the last command including the string 'awk'

Geçmişi arayabilir ve bir şeyi başka bir şeyle değiştirebilirsiniz:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

Ve çok daha fazlası, çünkü komut seçimi, arg seçimi, bağımsız arama ve değiştirme işlemlerini birleştirebilirsiniz.

Kabuğunuzun man sayfası (bu durumda man bash) arkadaşınızdır.


1
briliant! bu kabul edilen cevap olmalıdır.
Eliran Malka

5

Bash yerine zsh kullanıyorum ve bunu benim içimde bulunduruyorum ~/.zshrc, bu yüzden komut satırının başında Alt+ Seklerine basarak sudo:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

Ne yazık ki, bash de aynı şeyi yapmanın bir yolunu bulamadım.


3
Aynı şeyi GNU Readline kullanarak Bash'te kolayca yapabilirsiniz: sizinkine ekleyin ~/.inputrc "\es":"\C-asudo "ve uzun bir çizginin başlangıcına hareket edeceksiniz ve sudo çizginin başına basıldığında sudo eklenecektir alt-s. Terminali yeniden başlatın veya ~/.inputrcçalışması için tekrar okuyun .

2

Bunu bir takma adla yapmak istiyorsanız, bir alias redo='sudo $(history -p !!)'nedenden dolayı kullanmanız gerekir .


1
su -c "!!"

Sudo veya sudo programı ile root olma izniniz yoksa sisteme yüklenmedi.


1

Tercih ettiğim yol:

  • Ok tuşu
  • Ev
  • "sudo"
  • Giriş

Ama sadece "sudo !!" yapmak daha kolay olabilir, bu size kalmış.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.