eco “#!” falha – “evento não encontrado”

O seguinte falha e não entendo porque:

$ echo "#!" 

o seguinte também falha com a mesma mensagem de erro:

 $ echo "\#!" 

a mensagem de erro:

 -bash: !": event not found 

Por que isso falha? Como o echo deve ser feito?

    O ! caractere é usado para expansão de histórico no estilo csh .

    Se você não usar esse recurso, set +o histexpand (também conhecido como set +H ) para desativar esse comportamento. Está desativado para scripts, mas freqüentemente ativado para uso interativo.

    Como solução alternativa, você pode usar aspas simples em vez de aspas duplas – tendo em mente, de coure, sua semântica diferente. Se você precisa combinar aspas com interpolação variável, por exemplo, você pode mudar

     echo "#!$SHELL" # oops, history expansion breaks this 

    para dentro

      echo '#!'"$SHELL" 

    (observe as strings entre aspas simples e aspas duplas; depois que o shell terminar, as aspas serão removidas e a string #! será enviada ao lado do valor da variável SHELL sem espaço entre elas) ou número de outras soluções alternativas comuns como

      printf '#!%s\n' "$SHELL" 

    Por padrão, o bash suporta expansão de histórico compatível com csh .

    Na festança

     echo #! 

    imprimirá apenas uma nova linha, pois # inicia um comentário.

    Dentro

     echo "#!" 

    o # faz parte da sequência iniciada com " . Essas cadeias de caracteres ainda são inspecionadas pelo bash para caracteres especiais. ! é um caractere especial, se for seguido por qualquer outro texto.

     -bash: !": event not found 

    Neste caso, o bash espera que o !" token se refira a um comando anterior no histórico do shell " , e não o encontre. Tudo sozinho ! não irá desencadear esse comportamento:

     $ echo \# ! # ! $ echo fee ! fie fee ! fie 

    Finalmente,

     $ echo !echo 

    produz duas linhas, a primeira linha é impressa pelo shell para mostrar como o padrão acima se expande para:

     echo echo '# !' 

    enquanto a segunda linha é apenas o resultado da execução do comando expandido: echo #!


    Veja Também: A página man do Bash na Expansão do Histórico

     echo '#!' 

    Basicamente, com aspas duplas ( " ) aka” quoting fraco “, Bash faz algumas coisas malucas com a string, como substituição de variável. Com single ( ' ) aka” strong quoting “a string é interpretada literalmente.

    Veja por exemplo aqui para uma explicação mais detalhada de citação.

    No meu caso, todos os comandos estão funcionando. Talvez você possa especificar seu ambiente.

     $ echo "\#\!" \#\! $ echo "#!" echo "#" # $ echo "#!" echo "#" # $ echo $BASH_VERSION 3.2.48(1)-release 

    Outra solução alternativa pode ser colocar um espaço extra após o “!” :

     # echo "#! " #!