Terminal: prefixar o comando anterior?

7

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

Ok, então pressione 'up', segure / hammer 'left', digite sudo e aperte 'enter'.

É chato. Mais ainda, quanto mais tempo o comando era.

Note que perder sudo é o pior caso; um erro de digitação mais próximo do começo do que do final é igualmente irritante .

O que eu gostaria, é uma maneira de executar uma espécie de batida de tecla 'em casa'. Na verdade, talvez esses dois traços façam isso - mas o meu teclado MacBook não tem o Home, então não posso tentar.

Pontos de bônus para inserir sudo e "entrar" automaticamente, digamos, por CMD + Shift + S.

Isso pode ser feito ou estou sonhando?

    
por OJFord 03.07.2014 / 22:34

4 respostas

16

Simplesmente use UP e CTRL-A .

A função !sudo e sudo !! é fácil. Com uma diferença:

  • sudo !! executará o último comando obtido do histórico com sudo no começo.

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

  • Geralmente CTRL-A traz você no começo da linha em um terminal linux e CTRL-E até o final.
    Se você quiser, pode continuar usando sua estratégia. Você só precisa descobrir o atalho do seu sistema. Você pode encontrar uma lista de atalhos no ambiente gráfico e de texto aqui .

Apenas um aviso : sudo !! e !sudo funcionam muito rápido e você não tem controle visual da linha que está executando como superusuário . Isso pode resultar em prejudicial às vezes. Especialmente se você incorrer em 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 pessoal e todas as subpastas !! .

When you write a command with a space as a first character it's possible that it will not finish in the history. This depend from the value of the variable $HISTCONTROL. If the list of its values includes ignorespace (or ignoreboth) the lines which begin with a space character are not saved in the history list. So with sudo !! you will execute the last command before.

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

Última nota: menos é dramático o seu erro mais pode ser desonesto porque pode passar sem que você perceba ... e você corre o risco de ser chamado para pagar todos os interesses de uma conta que você não consegue lembrar.

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

shopt -s histverify

De man bash você pode ler

If the histverify shell option is enabled and readline is being used, history substitutions are not immediately passed to the shell parser. Instead, the expanded line is reloaded into the readline editing buffer for further modification.

Para que você possa ler e modificar, quando necessário, o comando que você executará.
Como não é a configuração padrão em muitas distribuições, ainda precisamos lembrar quando usamos outras contas.

    
por 04.07.2014 / 00:25
5

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

  • CTRL-A - Traz o cursor para o começo da linha atual
  • CTRL-E - Traz o cursor para o final da linha atual
  • Ctrl-Left - Move o cursor de volta uma palavra
  • CTRL-Right - Move o cursor para frente uma palavra
por 04.07.2014 / 03:38
4

Use

sudo !!

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

    
por 03.07.2014 / 22:42
3

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

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

Apenas no caso, estou colando aqui o seguinte, em relação ao comando history , e como esse comando ! funciona. Eu espero que isso ajude.

The history command

The history command can be used to list Bash's log of the commands you have typed:

This log is called the “history”. To access it type:

history n 

This will only list the last n commands. Type “history” (without options) to see the the entire history list.

You can also type !n to execute command number n. Use !! to execute the last command you typed.

!-n will execute the command n times before (in other words !-1 is equivalent to !!).

!string will execute the last command starting with that “string” and !?string? will execute the last command containing the word “string”. For example:

!cd will re-run the command that you last typed starting with “cd”.

commandName !* will execute the “commandName” with any arguments you used on your last command. This maybe useful if you make a spelling mistake, for example. If you typed:

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

In an attempt to execute emacs on the above two files this will obviously fail. So what you can do is type:

emacs !* 

This will execute emacs with the arguments that you last typed on the command-line. In other words this is equivalent to typing:

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

~ O histórico da linha de comando

    
por 03.07.2014 / 22:49