Cuando uso el siguiente código en la terminal SSH para CentOS, funciona bien:
paste <(printf "%s\n" "TOP")
Pero si coloco el mismo código de línea en un script de shell (test.sh) y ejecuto el script de shell desde la terminal, arroja un error ya que esto
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
¿Como puedo solucionar este problema?
dash
lugar debash
).#!/bin/sh
en la cima. Ejecuté comobash test.sh
pero tampoco funcionó.bash
en modo POSIX tampoco admite esa sintaxis (cuando se llama con--posix
o como/bin/sh
). Uso#!/bin/bash
.POSIXLY_CORRECT
variables configuradas cuando comienzasbash
?#!/bin/bash
en la parte superior solucionó el problema.Respuestas:
Sustitución de proceso no se ha especificado por POSIX, por lo que es compatible con toda la cáscara que POSIX, sólo algunas conchas como
bash
,zsh
,ksh88
,ksh93
apoyo.En el
Centos
sistema,/bin/sh
es enlace simbólico a/bin/bash
. Cuandobash
se invoca con nombresh
,bash
ingresa al modo posix ( Bash Startup Files - Invocado con nombre sh ). En modo posix,process substitution
no es compatible, causa un error de sintaxis.La secuencia de comandos debería funcionar, si llama
bash
directamentebash test.sh
. Si no, tal vezbash
ha entrado en modo posix. Esto puede ocurrir si comienzabash
con el--posix
argumento o la variablePOSIXLY_CORRECT
se establece cuando sebash
inicia:O
bash
está construido con--enable-strict-posix-default
opción.Aquí, no necesita la sustitución del proceso, puede usar tuberías de shell estándar:
-
es la forma estándar de decirpaste
que lea los datos de stdin. Con algunaspaste
implementaciones, puede omitirlo, aunque eso no es estándar.Donde sería útil es al pegar la salida de más de un comando como en:
En sistemas que admiten
/dev/fd/n
, eso se puede hacersh
con:(Es lo que
<(...)
hace internamente).fuente
Aquí hay otra solución alternativa. En lugar de ejecutar el comando, ejecuta bash y pasa el comando a bash usando -c:
fuente