error de sintaxis cerca del token inesperado `< '

Lo soy escribir un script para leer la salida de un comando en la variable ay b. Este es el script

#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b" 

y obtiene el error de sintaxis como:

line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)" 

Pero cuando estoy escribiendo el mismo comando en la consola, me funciona sin ningún problema.

app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED 

Se agradece mucho cualquier ayuda al respecto.

Comentarios

  • No puedo reproducir este comportamiento desde el script. ¿Cómo invocas el guión? Estoy invocando como: $ ./script.sh
  • @Ketan Lo estoy invocando como sh script.sh. Justo ahora intenté usar ./script.sh y está dando el resultado deseado. El valor de a es FALLIDO El valor de b es INICIADO. Muchas gracias por la respuesta … Solo quiero saber por qué es diferente al ejecutar el mismo script usando sh file.sh y ./file.sh ??
  • Suponga sh no ' t permite la sustitución de comandos. Intente invocar con bash script.sh. La misma llamada de ./script.sh se ejecuta con sha-bang que es / bin / ** bash ** en su secuencia de comandos.
  • @SudevJash ver: ¿Cuál es la diferencia entre ./ y sh para ejecutar un script?
  • @Costas Sí, funciona bien incluso con bash script.sh y estoy obteniendo el resultado deseado … Muchas gracias …

Responder

sh (que en la mayoría de los sistemas (derivados de Debian) está vinculado a dash) no permite sustitución de procesos . Intenta invocar con bash script.sh. La misma llamada de ./script.sh se ejecuta con sha-bang que es /bin/bash en su secuencia de comandos.

Comentarios

  • @MichaelDurrant Ah, tu modificación ahora significa lo contrario de lo que quise decir.
  • @muru No puedo ' no aceptar modificaciones t o bash. Me refiero a dash exactamente. file $(which sh) output /bin/sh: symbolic link to 'dash'
  • Costas, eso ' es lo que yo quiso decir. Michael Durrant cambió mi edición para reemplazar dash con bash. Gracias por solucionarlo.
  • Te refieres a la sustitución de procesos (<( echo foo )), no a la sustitución de comandos ($(echo foo)) (que es parte de la especificación POSIX).
  • @chepner Tiene razón. Gracias por su comentario. Reparado.

Respuesta

Estaba intentando invocar el script como sh file.sh y recibía el error . Pero cuando invoqué el mismo script que ./file.sh y bash file.sh, está funcionando y dando el resultado deseado.

Respuesta

Además, puede agregar la línea de abajo en la parte superior de su secuencia de comandos:

#!/bin/bash 

Le dice a su terminal / consola que ejecute su script como script bash, y luego su sustitución de proceso «<( cmd )» funcionará bien.

Comentarios

  • Tenga en cuenta que el script OP ' s ya tenía ese shebang, pero el OP se estaba ejecutando como sh file.sh en lugar de file.sh o ./file.sh (consulte su propia respuesta )

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *