ecoando símbolos no terminal / bash

4

Por que não consigo usar "!" ao tentar ecoar uma mensagem no terminal? Por exemplo:

echo -e "Hello\nWorld!"

bash retorna o seguinte comando:

bash !: event not found
    
por Brandon D. 27.05.2013 / 23:32

4 respostas

9

O caractere ! é chamado de "bang" e bash o utiliza para recuperar o histórico de comandos. Você pode usá-lo de quatro maneiras:

!<firstFewCharsOfPreviousCommand> 

exemplo:

!rm

Isso irá para o último comando que você executou que começou com "rm" e executará a coisa toda. Seja cuidadoso ao repetir comandos potencialmente destrutivos como o rm, já que você pode, sem intenção, executar outro que você pensou que faria. Acima é somente uma ilustração, usando a função de busca reversa CTRL-R do bash é uma alternativa muito mais segura.

!<indexInCommandHistory>

exemplo:

!433

O índice é o número que aparece ao lado do comando quando você executa o comando history .

!!

Não é necessário nenhum exemplo, pois isso é tudo. Ele re-executa o comando imediatamente anterior (o mesmo que seta para cima na maioria das distribuições Linux).

!$

Exemplo:

# ls -lh /etc/fstab
# vi !$

Outro literal, quando o bash executa isso, o !$ é substituído pela última palavra (string de caracteres sem espaço em branco)

Como você pode ver com o último, você pode até usá-lo como parte de um comando maior ou diferente. Outro exemplo disso com !! :

[root@hypervisor libsceptre]# echo hey
hey
[root@hypervisor libsceptre]# echo !!
echo echo hey    <-- printed to stderr so you know what !! was expanded to 
echo hey
[root@hypervisor libsceptre]#

Se você quiser que o bash, por alguma razão, visualize o caractere como um literal e não tente interpretá-lo, coloque o texto entre aspas simples:

[root@hypervisor libsceptre]# echo -e "Hello\nWorld!"
-bash: !": event not found
[root@hypervisor libsceptre]# echo -e 'Hello\nWorld!'
Hello
World!
[root@hypervisor libsceptre]#

A razão pela qual seu comando não está funcionando é porque ele está tentando encontrar o último comando que você escreveu que começou com uma aspa dupla (a funcionalidade descrita no meu primeiro exemplo) e não consegue encontrá-lo.

    
por 27.05.2013 / 23:43
2

Se você não usa a expansão do histórico (e obviamente você não o faz), então deve preferir desativá-lo a aprender as regras de citação e inibição estranhas.

set +H ou set +o histexpand livra-se disso. Você pode verificar se está ativo em echo $- ("H" mostra que está ativo) ou set -o ( histexpand ).

    
por 27.05.2013 / 23:56
1

Você precisa escapar do estrondo:

echo -e "Hello\nWorld"\!
Nota: Ter o estrondo fora das aspas é intencional. Caso contrário, \! é echod.

    
por 27.05.2013 / 23:42
1

O significado especial de ! ainda está ativo dentro de aspas duplas. ! é uma palavra-chave shell que, por exemplo, aceita um inteiro n como argumento e executa o comando n'th no seu histórico de shell. Use aspas simples ou escape do caractere para evitar confusão.

Você pode ler mais sobre a expansão de comandos do histórico em man history .

    
por 27.05.2013 / 23:43