Bagaimana saya bisa `alias sudo !!`?

50

Saya mencoba menetapkan alias untuk sudo !!di Bash. Saya mencoba alias sbb='sudo !!', tetapi itu menafsirkannya sebagai huruf !!dan cetakan

sudo: !!: command not found

Jika saya menggunakan tanda kutip ganda, itu menggantikan bang ganda dalam string itu sendiri, sehingga tidak berfungsi.

Apakah ada cara untuk membuat ini berfungsi? Atau alias alternatif? `

Manishearth
sumber
Lihat juga Jalankan sederetan perintah dengan satu sudo
Gilles 'SO- stop being evil'
Kemungkinan sama pada SU: superuser.com/questions/240180/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

61

!!diperluas oleh bash saat Anda mengetiknya. Itu tidak diperluas dengan substitusi alias.

Anda dapat menggunakan historybuilt-in untuk melakukan ekspansi:

alias sbb='sudo $(history -p !!)'

Jika perintah lebih dari sekadar perintah sederhana (mis. Perintah ini berisi pengalihan atau pipa), Anda perlu menjalankan shell di bawah sudo:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'
rici
sumber
Punya satu untuk tcsh?
mdpc
1
@mdpc: Saya tidak menggunakan tcsh, tapi aku melirik man tcshdan menemukan bahwa itu tidak melakukan ekspansi sejarah selama ekspansi alias "seolah-olah perintah asli adalah garis masukan sebelumnya." Menarik. Namun, alias sbb 'sudo \!-2tidak berfungsi seperti yang diharapkan (itu sebenarnya menggantikan entri kedua sebelumnya); alias sbb 'sudo \!\!'berhasil seperti yang diharapkan (diganti sbbuntuk !!); dan pada akhirnya ternyata apa yang saya inginkan adalah alias sbb 'sudo \!-1'yang saya harapkan akan sama dengan \!\!. (tcsh 6.17.06 (Astron) 2011-04-15) YMMV. Semoga berhasil.
rici
Terima kasih! Alias ​​ini bagus ketika sebagai administrator Anda lupa meletakkan sudo di depan perintah Anda.
mdpc
bukannya sbbsaya lebih suka preasesebagai alias seperti yang disarankan oleh @jpschorr
rubo77
40

Mencoba:

alias sbb='sudo $(fc -ln -1)'

Saya suka sebenarnya lebih suka memberi nama 'tolong':

alias please='sudo $(fc -ln -1)'

Info: fcadalah perintah bawaan pada bash shell. yang mencantumkan, mengedit, dan menjalankan kembali perintah yang sebelumnya dimasukkan ke shell interaktif.

jpschorr
sumber
13
pleasejelas merupakan cara untuk pergi!
Anto
berfungsi untuk bash juga menghapus komentar 'untuk zsh'.
Michael Durrant
1
Bekerja dengan baik di zsh. fc adalah perintah untuk digunakan. Terima kasih
Frax
pleasemembuatnya terasa seperti terminal adalah suatu entitas yang saya harus bersikap baik untuk menyelesaikan sesuatu. Saya lebih suka sesuatu yang memberikan rasa kontrol yang lebih baik - seperti fuck;)
Przemek D
5

Sekarang ada repositori untuk tujuan ini di GitHub, secara ajaib memeriksa apakah perlu hak pengguna super, juga memperbaiki kesalahan ketik:

https://github.com/nvbn/thefuck

Arda
sumber
Saya mencoba apt-get install thefuckyang ada, tetapi tidak berfungsi pada Ubuntu 15.10; (
rubo77
0

Ini awalnya diposting pada pertanyaan ini tetapi kemudian, disarankan untuk memposting di sini.

Inilah cara Anda dapat menggunakan fcdan historydengan alias untuk !-pengganti sejenis. Misalkan jika Anda ingin menggunakan !-n(di mana n adalah digit untuk n th perintah terakhir digunakan), maka Anda dapat menggunakan fcdan historydengan alias sebagai berikut:

  1. Menggunakan history:

    alias xyz='echo $(history -p "!-<n>") ; sudo $(history -p "!-n")'

    Catatan: Di sini !-nharus dilampirkan dengan 'atau ''.

  2. Menggunakan fc:

    alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)'

    Catatan: di sini 1 st dan 2 nd -n digunakan untuk menentukan kisaran daftar sejarah.

Di sini saya menggunakan gema sebelum mengeksekusi perintah untuk felling like !-<n>.

Pandya
sumber
Jawaban sebelumnya sudah mencakup history -pdan fc. Ada yang baru di sini?
muru
Ok, bagaimana dengan itu?
muru
Saya menemukan itu -ln -n -nmenjadi sangat membingungkan; juga sedikit tentang 'atau ''(dan juga sedikit tentang -<n>).
Scott
Opsi 2. harus salah ketik, saya pikir Anda ingin$(fc -ln -1)
cmcginty
-1
alias please="sudo $(history -p \!\-2)"
Antonin GAVREL
sumber