echo “#!” falla – “evento no encontrado”

Lo siguiente falla y no entiendo por qué:

$ echo "#!" 

lo siguiente también falla con el mismo mensaje de error:

 $ echo "\#!" 

el mensaje de error:

 -bash: !": event not found 

¿Por qué falla? ¿Cómo debería echo el echo ?

    El ! el carácter se usa para la expansión del historial de estilo csh .

    Si no usa esta función, set +o histexpand (también conocido como set +H ) desactiva este comportamiento. Está desactivado para scripts, pero a menudo está habilitado para uso interactivo.

    Como solución, puede usar comillas simples en lugar de comillas dobles, teniendo en cuenta, de acuerdo con sus diferentes semánticas. Si necesita combinar citas con interpolación variable, por ejemplo, puede cambiar

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

    dentro

      echo '#!'"$SHELL" 

    (fíjese en las cadenas contiguas entre comillas simples y comillas dobles; una vez que el intérprete de comandos haya terminado con esto, las comillas se eliminarán y la cadena #! aparecerá al lado del valor de la variable SHELL sin espacio entre ellas) o una número de otras soluciones comunes como

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

    Por defecto, bash admite la expansión de historial compatible con csh .

    En bash

     echo #! 

    solo imprimirá una línea nueva, ya que # comienza un comentario.

    En

     echo "#!" 

    el # es parte de la cadena comenzada con " . Tales cadenas todavía son inspeccionadas por bash para caracteres especiales. ! es un carácter especial si es seguido por cualquier otro texto.

     -bash: !": event not found 

    En este caso, bash espera que el token !" Haga referencia a un comando anterior en el historial de shell que comienza con " , y no encuentra uno. ¡Todo por sí mismo ! no desencadenará este comportamiento:

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

    Finalmente,

     $ echo !echo 

    produce dos líneas, la primera línea es impresa por el caparazón para mostrar cómo el patrón anterior se expande a:

     echo echo '# !' 

    mientras que la segunda línea es simplemente el resultado de ejecutar el comando expandido: echo #!


    Ver también: La página del hombre de Bash en Expansión de la historia

     echo '#!' 

    Básicamente, con comillas dobles ( " ) alias” citas débiles “, Bash hace algunas cosas absurdas con la cadena, como la sustitución de variables. Con la sola ( ' ) alias” citas fuertes “, la cadena se toma literalmente.

    Ver, por ejemplo, aquí para una explicación más detallada de las citas.

    En mi caso, todos los comandos están funcionando. Tal vez puedas especificar tu entorno.

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

    Otra solución puede ser poner un espacio extra después del “!” :

     # echo "#! " #!