`env foo = bar echo $ foo` no imprime nada

8

Creo que estoy teniendo una lluvia de ideas masiva. Yo esperaría

env foo=bar echo $foo

... para imprimir bar, pero en cambio obtengo una línea vacía. Wat

Lo mismo sucede si uso la sintaxis bash:

foo=bar echo $foo
badp
fuente

Respuestas:

8

Recientemente se respondió una pregunta similar : los símbolos se evalúan en la línea antes de que el símbolo se defina en esta línea, por lo que es necesario dividir la definición y el uso de los símbolos para separar las líneas.

Impulsado por un comentario, podría haber hecho esto:

foo=bar bash -c 'echo $foo'

que primero asigna un valor fooy lo pasa a un nuevo proceso como una variable de entorno donde se puede imprimir.

Puede leer más sobre esto en POSIX Shell Command Language Token Recognition .

Siguiendo el comentario de @mikeserv :

  • POSIX no es lo suficientemente explícito como para dar la respuesta completa.
  • Al comienzo de la sección citada, dice

    El shell leerá su entrada en términos de líneas de un archivo, de un terminal en el caso de un shell interactivo, o de una cadena en el caso de sh -c o system ().

  • al final dice

    Una vez que se delimita un token, se clasifica según lo requerido por la gramática en Shell Grammar.

  • pero POSIX no dice explícitamente que toda la línea está tokenizada antes de trabajar en la gramática.
  • en ese caso, confiamos en la práctica existente: el shell se ajusta porque nada contradice el estándar escrito, pero el estándar no puede usarse para predecir el comportamiento en todos los casos.
  • el mismo comentario se aplica, por supuesto, al comportamiento de los alias (por eso me referí a él como una pregunta similar ).
Thomas Dickey
fuente
o si está de acuerdo con citar el infierno,env foo=bar bash -c 'echo $foo'
badp
En realidad, la pregunta de alias se basa en la implicación de la sección de reconocimiento de tokens de que todos los tokens se calculan para una línea determinada antes de pasar a la gramática. Pero para ambos, el estándar no es explícito , lo que hace que confíes en la práctica existente.
Thomas Dickey
@ thomasdickey - sí, esa fue mi esencia también. ya sabes, cuando escribes un comentario, si haces @username...commentel usuario que especifiques, recibirá un pequeño mensaje que les hará saber que hablas con ellos. bueno, lo harán si es relevante para el hilo.
mikeserv
@mikeserv (como este). hmm: lo tendré en cuenta (aunque no era evidente cómo funciona con espacios en blanco incrustados).
Thomas Dickey
como eso. Tangencialmente, eché un vistazo luit.cy creo que puedo cambiar setup_io(){ ... ;fnctl(0, [GS]ETFL, 0);...}para hacer 2el primer argumento. bueno, creo que las funciones copyTermios()y también setRawTermios()podrían necesitar una pequeña modificación, pero creo que debería ser simple. el rc = (return)para cada línea parece extraño, pero tampoco soy un programador en C. es eso tuyo o fue heredado? y si su comentario en blanco se refiere a "${set_null_var:=new val and $(echo other stuff)}"que está mayormente seguro con cualquier cosa. algunas conchas harán cosas raras con }.
mikeserv