Jalankan kembali perintah sebelumnya di bawah sudo

8

Saya ingin dapat menjalankan perintah, gagal karena tidak memiliki izin yang tepat. Lalu aku bisa menulis "tolong" pada sudo perintah yang baru saja aku jalankan.

Inilah yang ingin saya lakukan di terminal:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

Saya melihat bahwa !!akan mengambil perintah sebelumnya, jadi saya pikir saya bisa menggunakannya, tetapi saya tidak bisa membuatnya bekerja.

skrip shell please.sh saya terlihat seperti ini, tetapi saya tidak bisa menjalankan semua ini. Itu hanya mengatakan "perintah tidak ditemukan !!" dan mencetak penggunaan sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)
jb.
sumber
Apakah ini berfungsi tanpa skrip? Jika Anda hanya menjalankan sudo !!apakah itu berjalan seperti yang diharapkan? Kupikir !! mungkin hanya bash alias, jadi mungkin tidak berfungsi di zsh
Chris Wayne
3
AFAIK, ekspansi riwayat ( !!dan lainnya) hanya berfungsi di shell interaktif dan bukan di skrip.
Thor
sudo !!dalam mode interaktif hampir berfungsi seperti yang diharapkan. ketika saya menekan enter itu akan menggantikan !!dengan perintah sebelumnya. maka saya harus menekan enter lagi untuk menjalankannya.
jb.

Jawaban:

6

Anda tidak dapat menggunakan !!skrip shell, karena Anda tidak dapat mengakses shell induk di shell anak. Meskipun saya sarankan menggunakan sudo !!, jika Anda benar-benar ingin membuat skrip BASH, Anda harus menggunakan .bash_history, seperti:

#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

Ini jelas BUKAN solusi yang sempurna, tetapi harus melakukan trik. Jika Anda menggunakan ZSH, ini tidak akan berfungsi, karena ZSH tidak menghasilkan .bash_history (setahu saya). UPDATE : Ini adalah versi yang dapat digunakan dengan ZSH:

#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

Semoga ini membantu!

Jika Anda tidak mengerti skrip, itu hanya menjalankan perintah terakhir yang dimasukkan dalam BASH dengan sudo.

MiJyn
sumber
baik. Saya menggunakan zsh. apakah ada yang setara dengan .bash_history di zsh?
jb.
Sekarang saya melihat, ya, ada versi yang harusnya berfungsi. Saya belum mengujinya.
MiJyn
Jangan membaca file sejarah bash secara langsung. Gunakan fcatau historybawaan. Secara default, $ HISTFILE tidak diperbarui hingga Anda keluar dari bash.
Steven K
24

Tambahkan ke .zshrc Anda:

alias please='sudo $(fc -ln -1)'
jpschorr
sumber
Bekerja memperlakukan, tampaknya lebih baik daripada jawaban yang diterima di atas untuk kemudahan penggunaan
Mitchell Currie
2
Untuk yang penasaran: fcsingkatan dari perintah fix. Dokumentasinya ada di sini .
dshepherd
Terima kasih! Aku tahu ini adalah AskUbuntu, tapi saya menggunakan ini pada OSX untuk menyalin perintah terakhir saya ke clipboard sistem: alias lastcmd="fc -ln -1 | pbcopy"Saya percaya ini harus bekerja pada Ubuntu (?): alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad