[bash] ¿Por qué a veces se necesita espacio en blanco alrededor de metacaracteres?



1 Answers

Solo tatúa un

#!/bin/zsh

shebang por encima y estarás bien.

Question

Hace unos meses me tatué una bomba de tenedor en el brazo, y salté los espacios en blanco, porque creo que se ve mejor sin ellos. Pero, para mi consternación, a veces (no siempre) cuando lo ejecuto en un shell no se inicia una bomba de horquilla, sino que simplemente da un error de sintaxis.

bash: syntax error near unexpected token `{:'

Ayer sucedió cuando traté de ejecutarlo en el shell Bash un amigo, y luego agregué el espacio en blanco y de repente funcionó :(){ :|:& };: lugar de :(){:|:&};:

¿El espacio en blanco importa? ¿He tatuado un error de sintaxis en mi brazo?

Parece que siempre funciona en zsh , pero no en Bash.

Una pregunta relacionada no explica nada sobre los espacios en blanco, que realmente es mi pregunta; ¿Por qué es necesario el espacio en blanco para que Bash pueda analizarlo correctamente?




Aunque no es fácilmente visible en la fuente del tatuaje, en realidad hay una Marca de Orden de Byte (BOM) entre el corsé y el colon (es posible que haya estado lo suficientemente intoxicado cuando recibió el tatuaje que no lo notó, pero está realmente allí) . Esto deja tres posibilidades obvias:

  1. Error al escribir la lista de materiales cuando transcribiste el código. El resultado es una aplicación obvia de GIGO. El shell simplemente no reconoce una lista de materiales que no está presente en su transcripción fallida.
  2. Tu caparazón es muy viejo. No reconoce caracteres Unicode, por lo que la lista de materiales (y probablemente todos los demás caracteres Unicode) se ignora por completo, aunque una BOM en cualquier lugar, pero el comienzo de un archivo se debe tratar como un espacio de ancho cero sin interrupción .
  3. Tu caparazón es demasiado nuevo. El uso de una lista de materiales como ZWNBS está en desuso, y los autores han implementado una versión futura de Unicode en la que este uso ya no está permitido.



Related