Bash: error de sintaxis: redirección inesperada

138

Hago esto 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 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?

Abre el camino
fuente
Como referencia, el comando también funciona en cygwin (/ bin / bash --version GNU bash, versión 3.2.49 (23) -release (i686-pc-cygwin) Copyright (C) 2007 Free Software Foundation, Inc.)
hlovdal

Respuestas:

243

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

John Kugelman
fuente
14

Estibador:

Estaba recibiendo este problema de mi Dockerfile como tenía:

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 hace posible evitar la mezcla de cadenas de shell y los RUN comandos que usan 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.

kemicofa fantasma
fuente
14

Si está utilizando lo siguiente para ejecutar su script:

sudo sh ./script.sh

Entonces querrás usar lo siguiente en su lugar:

sudo bash ./script.sh

La razón de esto es que Bash no es el shell predeterminado para Ubuntu. Entonces, si usa "sh", entonces solo usará el shell predeterminado; que en realidad es Dash Esto sucederá independientemente de si tiene #!/bin/bashen la parte superior de su secuencia de comandos. Como resultado, deberá especificar explícitamente el uso bashcomo se muestra arriba, y su secuencia de comandos debe ejecutarse como se espera.

Dash no admite redirecciones iguales a Bash.

Chris Pietschmann
fuente
6

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

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

se puede escribir como:

nc -l -p 80 <<EOF
tested like a charm
EOF

y así (esto es lo que quieres):

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

Ejemplo práctico en busyboxdebajo del dockercontenedor:

kasra@ubuntu:~$ docker run --rm -it busybox
/ # nc -l -p 80 <<< "tested like a charm";
sh: syntax error: unexpected redirection


/ # nc -l -p 80 <<EOL
> 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 <<EOF
> $text
> EOF
^Cpunt!
AmirHossein
fuente
... o echo 'text' | ncque es aún más corto.
phil294
2

hazlo de la manera más simple,

direc=$(basename `pwd`)

O usa el caparazón

$ direc=${PWD##*/}
ghostdog74
fuente
1

Otra razón para el 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 ...

Motin
fuente
1

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

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

Por eso me encontraba con este problema cuando lo usaba sudo.

Michael Mather
fuente
0

En mi caso, el error se debe a que he puesto ">>" 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
Mansur Ali
fuente
0

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, ejecútelos usando el siguiente comando "bash script_name.sh"

si el script comienza con / bin / sh, ejecútelo usando el siguiente comando "sh script_name.sh"

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

Diferentes distribuciones de Linux que tienen diferentes shells por defecto.

Sijeesh
fuente
1
Aunque le agradecemos su respuesta, sería mejor si proporcionara un valor adicional además de las otras respuestas. En este caso, su respuesta no proporciona un valor adicional, ya que otro usuario ya publicó esa solución. Si una respuesta anterior fue útil para usted, debe votarla en lugar de repetir la misma información.
Toby Speight el
¿No crees que te expliqué la solución aquí con un ejemplo?
Sijeesh
¿Hay algo aquí que no esté cubierto adecuadamente en la respuesta de John Kugelman escrita hace 8 años?
Toby Speight