Eseguire nuovamente il comando precedente in sudo


8

Voglio essere in grado di eseguire un comando, non riesce perché non ha le autorizzazioni appropriate. Quindi posso scrivere "per favore" per eseguire il comando appena eseguito.

Ecco cosa voglio fare nel terminale:

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

Ho visto che !!afferrerà il comando precedente, quindi ho pensato di poterlo usare, ma non riesco a farlo funzionare.

il mio script shell please.sh è simile a questo, ma non riesco a far funzionare nessuno di questi. Dice solo "comando non trovato !!" e stampa l'uso di sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)

Funziona senza la sceneggiatura? Se corri sudo !!, funziona come previsto? Penso !! potrebbe essere solo un alias bash, quindi potrebbe non funzionare in zsh
Chris Wayne,

3
AFAIK, l'espansione della cronologia ( !!e altri) funziona solo nelle shell interattive e non negli script.
Thor,

sudo !!in modalità interattiva funziona quasi come previsto. quando ho premuto invio avrebbe sostituito !!con il comando precedente. quindi ho dovuto premere di nuovo Invio per eseguirlo.
jb.

Risposte:


6

Non è possibile utilizzare !!in uno script di shell, poiché non è possibile accedere alla shell padre in una shell figlio. Anche se ti consiglio di usare sudo !!, se vuoi davvero creare uno script BASH, dovresti usare .bash_history, in questo modo:

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

Non è sicuramente una soluzione perfetta, ma dovrebbe fare il trucco. Se stai usando ZSH, questo non funzionerà, dato che ZSH non produce in .bash_history (per quanto ne so). AGGIORNAMENTO : ecco una versione che dovrebbe funzionare con ZSH:

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

Spero che sia di aiuto!

Se non capisci lo script, esegue semplicemente l'ultimo comando inserito in BASH con sudo.


ok. Sto usando zsh però. esiste un equivalente per .bash_history in zsh?
jb.

Ora che guardo, sì, c'è una versione che dovrebbe funzionare. Non l'ho ancora testato però.
MiJyn,

Non leggere direttamente il file della cronologia di bash. Utilizzare il fco historybuilt-in. Per impostazione predefinita, $ HISTFILE non viene aggiornato fino a quando non ci si disconnette da bash.
Steven K,

24

Aggiungi al tuo .zshrc:

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

Funziona a meraviglia, sembra meglio della risposta sopra accettata per facilità d'uso.
Mitchell Currie,

2
Per i curiosi: fcsta per comando di correzione. La documentazione è qui .
pastore,

Grazie! So che questo è Ask Ubuntu, ma ho usato questo su OSX per copiare il mio ultimo comando negli appunti di sistema: alias lastcmd="fc -ln -1 | pbcopy"Credo che questo dovrebbe funzionare su Ubuntu (?): alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.