Bash: error de syntax: redirección inesperada

Lo hago en un script:

read direc <<< $(basename `pwd`) 

y obtengo:

 Syntax error: redirection unexpected 

en una máquina ubuntu

 /bin/bash --version GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu) 

mientras que no obtengo este error en otra máquina suse:

 /bin/bash --version GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc. 

¿Por qué el error?

¿Tu script hace referencia a /bin/bash o /bin/sh en su línea hash bang? El shell del sistema predeterminado en Ubuntu es dash , no bash , por lo que si tiene #!/bin/sh , su script usará un shell diferente del esperado. Dash no tiene el operador de redirección <<< .

Estibador:

Estaba obteniendo este problema de mi archivo Docker como lo hice:

 RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) 

Sin embargo, de acuerdo con este problema , se resolvió:

La forma ejecutiva permite evitar el munging de cadenas de shell y ejecutar comandos usando una imagen base que no contiene /bin/sh .

Nota

Para usar un shell diferente, que no sea /bin/sh , use el formulario exec que pasa en el shell deseado. Por ejemplo,

 RUN ["/bin/bash", "-c", "echo hello"] 

Solución:

 RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"] 

Observe las comillas alrededor de cada parámetro.

hazlo de la manera más simple,

 direc=$(basename `pwd`) 

O usa el caparazón

 $ direc=${PWD##*/} 

Otro motivo del error puede ser si está ejecutando un trabajo cron que actualiza una copia de trabajo de subversión y luego ha intentado ejecutar un script versionado que estaba en un estado conflictivo después de la actualización …

Puedes obtener el resultado de ese comando y ponerlo en una variable. luego usa heredoc . por ejemplo:

 nc -l -p 80 <<< "tested like a charm"; 

se puede escribir como:

 nc -l -p 80 < 

y así (esto es lo que quieres):

 text="tested like a charm" nc -l -p 80 < 

Ejemplo práctico en busybox bajo el contenedor de docker :

 kasra@ubuntu:~$ docker run --rm -it busybox / # nc -l -p 80 <<< "tested like a charm"; sh: syntax error: unexpected redirection / # nc -l -p 80 < tested like a charm > EOL ^Cpunt! => socket listening, no errors. ^Cpunt! is result of CTRL+C signal. / # text="tested like a charm" / # nc -l -p 80 < $text > EOF ^Cpunt! 

En mi caso, el error es porque puse “>>” dos veces

 mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH 

solo lo corrijo como

 mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH 

En mi máquina, si ejecuto un script directamente, el valor predeterminado es bash .

Si lo ejecuto con sudo , el valor predeterminado es sh .

Es por eso que estaba atacando este problema cuando usé sudo .

Antes de ejecutar el script, debe verificar la primera línea del script de shell para el intérprete.

Por ejemplo: si los scripts comienzan con / bin / bash, ejecute el script usando el siguiente comando “bash script_name.sh”

si el script comienza con / bin / sh, ejecute el script usando el siguiente comando “sh script_name.sh”

./sample.sh – Esto detectará el intérprete desde la primera línea del script y se ejecutará.

Diferentes distribuciones de Linux que tienen diferentes shells por defecto.