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 <<<
.
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"]
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.