O comando histórico

O comando histórico

Freqüentemente no Terminal (embora eu espere que qualquer resposta funcione no bash e na maioria dos outros), digito algum comando e recebo algum tipo de erro de permissão devido à falta de sudo.

Ok, então pressione 'para cima', segure/martele 'esquerda', digite sudoe pressione 'enter'.

É irritante. Mais ainda, quanto mais longo era o comando.

Observe que faltar sudoé o pior caso; um erro de digitação mais próximo do início do que do fim é igualmente irritante.

O que eu gostaria é de uma maneira de executar uma espécie de pressionamento de tecla 'para cima e para casa'. Na verdade, talvez esses dois toques resolvam - mas o teclado do meu Macbook não tem Home, então não posso tentar.

Pontos de bônus por uma maneira de inserir sudoe pressionar 'enter' automaticamente também, digamos, por CMD + Shift + S.


Isso pode ser feito ou estou sonhando?

Responder1

Basta usar UPe CTRL-A.

Ambos !sudofuncionam sudo !!facilmente. Com uma diferença:

  • sudo !!irá executar o último comando retirado do histórico sudono início.

  • !sudoexecutará o último comando do histórico que começou com sudo.

  • Geralmente CTRL-Atraz você no início da linha em um terminal Linux e CTRL-Eaté o final.
    Se quiser, você pode continuar usando sua estratégia. Você só precisa descobrir o atalho do seu sistema. Você pode encontrar uma lista deatalhosem ambiente gráfico e de textopor exemplo, aqui.

Apenas umaviso: sudo !!e !sudofunciona muito rápido evocê não tem controle visual da linha que está executando como superusuário. Isto pode resultarprejudicialàs vezes. Especialmente se você tiver um erro de impressão.

Vamos fazer um exemplo dramático:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

Tarde demais, você acabou de apagar seu diretório inicial e todas as subpastas !!.

Quando você escreve um comando com um espaço como primeiro caractere é possível que ele não termine no histórico. Isto depende do valor da variável $HISTCONTROL. Se a lista de seus valores incluirignorar espaço(ouignore ambos) as linhas que começam com um caractere de espaço não são salvas na lista do histórico. Então, com sudo !! você executará o último comando anterior.

Você pode imaginar uma situação semelhante com !sudo, ele executará o último comando começando com sudoregistrado no histórico, mas se o último que você lembra estava começando com um espaço... agora você sabe que usará outro.

Última nota: menos é dramático o seu erro mais pode ser tortuoso porque pode passar sem que você perceba... e você correrá o risco de ser chamado a pagar todos os juros de uma conta da qual não consegue se lembrar.


Atualização (Bash é ótimo):
com versões recentes do Bash é possível corrigir esse comportamento perigoso com o seguinte comando que sugiro colocar no ~/.bashrcarquivo:

shopt -s histverify

De man bashvocê pode ler

Se overificação históricaopção shell está habilitada eLeia a linhaestá sendo usado,as substituições do histórico não são passadas imediatamente para o analisador de shell.Em vez disso, a linha expandida é recarregada no buffer de edição readline para modificações adicionais.

Assim você pode ler e modificar quando necessário o comando que irá executar.
Como não é a configuração padrão em muitas distribuiçõesainda precisamos nos lembrar disso quando usarmos outras contas.

Responder2

Aqui estão algumas combinações de teclado comuns que muitos programas Mac e Linux usam (embora não tenhamos certeza de quais são seguidas pela maioria dos aplicativos do Windows):

  • CTRL-A- Mova o cursor para o início da linha atual
  • CTRL-E- Leve o cursor até o final da linha atual
  • CTRL-Left- Mova o cursor uma palavra para trás
  • CTRL-Right- Mova o cursor para frente uma palavra

Responder3

Usar

sudo !!

O !!será substituído pelo comando anterior completo.

Responder4

@WChargin está correto em relação a !sudo, então estou mudando minha resposta ...

sudo !!é a resposta correta, como muitos disseram.

Por precaução, estou colando aqui o seguinte, em relação ao historycomando e como esse !comando funciona. Eu espero que isso ajude.


O comando histórico

O comando history pode ser usado para listar o log dos comandos que você digitou no Bash:

Este registro é chamado de “histórico”. Para acessá-lo digite:

history n 

Isso listará apenas os últimos n comandos. Digite “histórico” (sem opções) para ver toda a lista do histórico.

Você também pode digitar!npara executar o comando número n. Usar!!para executar o último comando que você digitou.

!-nirá executar o comando n vezes antes (em outras palavras!-1é equivalente a!!).

!stringirá executar o último comando começando com aquela “string” e !?string?irá executar o último comando contendo a palavra “string”. Por exemplo:

!cdirá executar novamente o comando que você digitou pela última vez, começando com “cd”.

commandName !*executará o “commandName” com quaisquer argumentos que você usou em seu último comando. Isto pode ser útil se você cometer um erro ortográfico, por exemplo. Se você digitou:

emasc /home/fred/mywork.java /tmp/testme.java 

Na tentativa de executar o emacs nos dois arquivos acima, isso obviamente falhará. Então o que você pode fazer é digitar:

emacs !* 

Isso executará o emacs com os argumentos que você digitou pela última vez na linha de comando. Em outras palavras, isso equivale a digitar:

emacs /home/fred/mywork.java /tmp/testme.java

~O histórico da linha de comando

informação relacionada