Uruchom ponownie poprzednie polecenie w sudo

8

Chcę móc uruchomić polecenie, nie powiedzie się, ponieważ nie ma odpowiednich uprawnień. Następnie mogę napisać „proszę”, aby sudo polecenie, które właśnie uruchomiłem.

Oto, co chcę robić w terminalu:

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

Widziałem, że !!pobierze poprzednie polecenie, więc pomyślałem, że mogę go użyć, ale nie mogę go uruchomić.

mój skrypt powłoki please.sh wygląda tak, ale nie mogę zmusić żadnego z nich do działania. Mówi tylko „nie znaleziono polecenia !!” i drukuje użycie sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)
jb.
źródło
Czy to działa bez skryptu? Jeśli po prostu uruchomisz, sudo !!czy będzie działał zgodnie z oczekiwaniami? Myślę !! może być po prostu pseudonimem bash, więc może nie działać w zsh
Chris Wayne,
3
AFAIK, ekspansja historii ( !!i inne) działa tylko w interaktywnych powłokach, a nie w skryptach.
Thor
sudo !!w trybie interaktywnym działa prawie zgodnie z oczekiwaniami. po wciśnięciu enter zastąpi !!poprzednie polecenie. następnie musiałem ponownie nacisnąć Enter, aby go uruchomić.
jb.

Odpowiedzi:

6

Nie można używać !!w skrypcie powłoki, ponieważ nie można uzyskać dostępu do powłoki nadrzędnej w powłoce podrzędnej. Chociaż zalecam używanie sudo !!, jeśli naprawdę chcesz stworzyć skrypt BASH, musisz użyć .bash_history, tak jak poniżej:

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

To zdecydowanie NIE jest idealne rozwiązanie, ale powinno wystarczyć. Jeśli używasz ZSH, to nie zadziała, ponieważ ZSH nie wyświetla danych wyjściowych do .bash_history (o ile wiem). AKTUALIZACJA : Oto wersja, która powinna współpracować z ZSH:

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

Mam nadzieję że to pomoże!

Jeśli nie rozumiesz skryptu, uruchamia on po prostu ostatnie polecenie wprowadzone w BASH za pomocą sudo.

MiJyn
źródło
ok. Używam jednak Zsh. czy jest jakiś odpowiednik .bash_history w Zsh?
jb.
Teraz, kiedy patrzę, tak, jest wersja, która powinna działać. Jednak jeszcze tego nie przetestowałem.
MiJyn
Nie czytaj bezpośrednio pliku historii bash. Użyj fclub historywbudowanych. Domyślnie $ HISTFILE nie jest aktualizowany, dopóki nie wylogujesz się z bash.
Steven K
24

Dodaj do swojego .zshrc:

alias please='sudo $(fc -ln -1)'
jpschorr
źródło
Działa uczta, wydaje się lepsza niż powyżej zaakceptowanej odpowiedzi dla łatwości użycia.
Mitchell Currie,
2
Dla ciekawskich: fcoznacza polecenie naprawy. Dokumentacja jest tutaj .
dshepherd
Dziękuję Ci! Wiem, że to AskUbuntu, ale kiedyś to na OSX skopiować mój ostatni rozkaz do schowka systemowego: alias lastcmd="fc -ln -1 | pbcopy"Wierzę, że to powinno działać na Ubuntu (?): alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad