echo de uma string com um ponto de exclamação

6

Aqui estão o que eu coloquei no bash e os resultados que obtive sobre o 'echo':

$ echo '!$'   
!$  
$ echo "!$"  
echo "'!$'"  
'!$'

Gostaria de saber como o "eco" lida com a segunda entrada. Parece-me que 'echo' primeiro imprimiria as strings (expanda algumas, se necessário) que você digitou e, em seguida, executaria certas se elas fossem executáveis.

Um exemplo mais surpreendente que posso construir, mas não consigo entender é:

$ echo '!$'  
!$  
$ echo "!echo "!$""  
echo "echo '!$' "'!$'""  
echo '!$' !$
    
por booksee 06.09.2014 / 20:54

2 respostas

8

No comando:

echo "!$"

!$ é expandido em bash antes de passar para echo . Dentro de aspas duplas , se habilitado, a expansão do histórico será executada, a menos que você escape de ! , usando barra invertida \ . bash tinha feito a expansão, echo não faz nada aqui, apenas imprime o que tem.

! $ refere-se ao último argumento do anterior comando, que é a string '!$' .

No seu segundo exemplo:

$ echo '!$'
!$
$ echo "!echo "!$""
echo "echo '!$' "'!$'""
echo '!$' !$

Comando echo "echo '!$' "'!$'"" , os argumentos passados para echo estão divididos em três partes:

  • Primeiro: "echo '!$' " , expandido para a string echo '!$' .
  • Segundo: '!$' , expandido para a string !$ .
  • Terceiro: "" expandido para string vazia.
por 06.09.2014 / 21:02
2

echo simplesmente itera seus argumentos e os envia para o padrão.

Toda a magia é feita pela casca: A casca substitui algum padrão para os outros. como variáveis (começando com $ ), histórico (começando com ! ), etc.

Veja o manual bash para mais detalhes.

    
por 06.09.2014 / 23:32