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
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 adash
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
conbash
. 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 defile.sh
o./file.sh
(consulte su propia respuesta )
$ ./script.sh
sh
no ' t permite la sustitución de comandos. Intente invocar conbash script.sh
. La misma llamada de./script.sh
se ejecuta consha-bang
que es / bin / ** bash ** en su secuencia de comandos.