Hace unos meses me tatué una bomba tenedor en el brazo, y me salteé 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 tenedor, pero solo da un error de sintaxis.
bash: syntax error near unexpected token `{:'
Ayer sucedió cuando intenté ejecutarlo en el shell Bash de un amigo , y luego agregué el espacio en blanco y de repente funcionó, en :(){ :|:& };:
lugar de:(){:|:&};:
¿Importa el espacio en blanco? ¿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 acerca de los espacios en blanco, que realmente es mi pregunta; ¿Por qué se necesita el espacio en blanco para que Bash pueda analizarlo correctamente?
fuente
Respuestas:
Hay una lista de personajes que separan los tokens en BASH. Estos caracteres se llaman meta-caracteres y son
|
,&
,;
,(
,)
,<
,>
, el espacio y la pestaña . Por otro lado, las llaves ({
y}
) son solo caracteres ordinarios que forman palabras.Omitir el segundo espacio antes
}
servirá, ya que&
es un metacarácter. Por lo tanto, su tatuaje debe tener al menos un carácter espacial.fuente
on the other hand
... juego de palabras intencionado? ;): D (Lo siento, por el comentario fuera del tema.){
y}
son palabras clave de shell en este contexto. Solo si no se reconocen como tales, debido a la falta de espacios / metacaracteres circundantes, se los trata como una parte literal de la palabra de la que se convierten. (Y luego está la expansión de{foo} () { echo hello; }
"Nombre", tal como se definebash
como "una palabra que consiste solo en caracteres alfanuméricos y guiones bajos, y que comienza con un carácter alfabético o un guión bajo", se aplica solo a los nombres de variables.Solo tatúa un
Shebang encima y estarás bien.
fuente
Las llaves se parecen más a palabras clave extrañas que a símbolos especiales, y necesitan espacios. Esto es diferente a los paréntesis, por ejemplo. Comparar:
que funciona y:
que busca un comando llamado
{ls}
. Para trabajar, tiene que ser:El punto y coma detiene la llave de cierre que se toma como parámetro para
ls
.Todo lo que tiene que hacer es decirle a la gente que está utilizando una fuente proporcional con un carácter de espacio bastante estrecho.
fuente
ls
.Aunque no es fácilmente visible en la fuente del tatuaje, en realidad hay una Marca de orden de bytes (BOM) entre el aparato ortopédico y el colon (es posible que haya estado lo suficientemente intoxicado cuando recibió el tatuaje que no lo notó, pero realmente está allí) . Esto deja tres posibilidades obvias:
fuente
Es por la forma en que analiza el shell. Necesita un espacio después de que comience la definición de la función, es decir, después de
{
.son validos. Por otra parte,
no lo es
Realmente necesitas un tatuaje como este:
De la fuente :
Omitir un espacio después de esto
{
hace{echo
que se interprete como un token único.Una forma equivalente de
sería
Tenga en cuenta que no hay espacio después
{
en la versión alternativa, pero un salto de línea hace que el shell se reconozca{
como un token.fuente
{echo
antes de que haya alcanzado una llave de apertura requerida?