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 $(!!)

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.


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)'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.