Execute novamente o comando anterior no sudo

8

Eu quero poder executar um comando, ele falha porque não tem permissões apropriadas. Então eu posso escrever "please" para sudo o comando que acabei de executar.

Aqui está o que eu quero fazer no terminal:

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

Vi que !!ele pegaria o comando anterior, então pensei que poderia usá-lo, mas não consigo fazê-lo funcionar.

meu script de shell please.sh se parece com isso, mas não consigo fazer com que nenhum deles funcione. Diz apenas "comando não encontrado !!" e imprime o uso do sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)
jb.
fonte
Funciona sem o script? Se você apenas executar sudo !!, ele será executado conforme o esperado? Eu acho que !! pode ser apenas um alias de bash, por isso pode não funcionar em zsh
Chris Wayne
3
AFAIK, a expansão do histórico ( !!e outros) só funciona em shells interativos e não em scripts.
Thor
sudo !!no modo interativo quase funciona como esperado. quando eu pressione enter, ele substituirá !!o comando anterior. então eu tive que pressionar enter novamente para executá-lo.
jb.

Respostas:

6

Você não pode usar !!em um script de shell, pois não pode acessar o shell pai em um shell filho. Embora eu recomende o uso sudo !!, se você realmente deseja criar um script BASH, teria que usar .bash_history, assim:

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

Definitivamente NÃO é uma solução perfeita, mas deve funcionar. Se você estiver usando o ZSH, isso não funcionará, pois o ZSH não gera saída para .bash_history (que eu saiba). UPDATE : Aqui está uma versão que deve funcionar com o ZSH:

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

Espero que isto ajude!

Se você não entende o script, ele simplesmente executa o último comando digitado no BASH com o sudo.

MiJyn
fonte
Está bem. Estou usando o zsh embora. existe algum equivalente para .bash_history no zsh?
jb.
Agora que olho, sim, há uma versão que deve funcionar. Ainda não testei ainda.
21412 MiJyn
Não leia o arquivo do histórico do bash diretamente. Use os fcou historyinternos. Por padrão, o $ HISTFILE não é atualizado até você sair do bash.
Steven K
24

Adicione ao seu .zshrc:

alias please='sudo $(fc -ln -1)'
jpschorr
fonte
Funciona um tratamento, parece melhor do que a resposta acima aceita para facilitar o uso.
Mitchell Currie
2
Para os curiosos: fcsignifica comando de correção. A documentação está aqui .
Dshepherd 6/01/16
Obrigado! Eu sei que isto é AskUbuntu, mas eu usei isso em OSX para copiar o meu último comando para a área de transferência do sistema: alias lastcmd="fc -ln -1 | pbcopy"Eu acredito que este trabalho deve no Ubuntu (?): alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad