Bash: errore di sintassi: reindirizzamento imprevisto


138

Lo faccio in uno script:

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

e ottengo:

Syntax error: redirection unexpected

in una macchina Ubuntu

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

mentre non ottengo questo errore in un'altra macchina di suse:

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

Perché l'errore


Per riferimento, il comando funziona anche su cygwin (/ bin / bash --version GNU bash, versione 3.2.49 (23) -release (i686-pc-cygwin) Copyright (C) 2007 Free Software Foundation, Inc.)
hlovdal

Risposte:


243

Il tuo script fa riferimento /bin/basho /bin/shnella sua linea di hash bang? La shell di sistema predefinita in Ubuntu è dash , non bash , quindi se hai lo #!/bin/shscript userà una shell diversa da quella che ti aspetti. Dash non ha l' <<<operatore di reindirizzamento.


14

docker:

Stavo ricevendo questo problema dal mio Dockerfile come avevo:

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

Tuttavia, in base a questo problema , è stato risolto:

Il modulo exec consente di evitare il munging delle stringhe di shell e di RUN comandi usando un'immagine di base che non contiene /bin/sh.

Nota

Per utilizzare una shell diversa, oltre a /bin/sh, utilizzare il modulo exec passando nella shell desiderata. Per esempio,

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

Soluzione:

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

Notare le virgolette attorno a ciascun parametro.


14

Se si utilizza quanto segue per eseguire lo script:

sudo sh ./script.sh

Quindi ti consigliamo di utilizzare quanto segue:

sudo bash ./script.sh

La ragione di ciò è che Bash non è la shell predefinita per Ubuntu. Quindi, se usi "sh", userà solo la shell predefinita; che in realtà è Dash. Questo accadrà a prescindere se hai #!/bin/bashnella parte superiore della tua sceneggiatura. Di conseguenza, dovrai specificare esplicitamente l'uso bashcome mostrato sopra e lo script dovrebbe essere eseguito come previsto.

Dash non supporta i reindirizzamenti come Bash.


6

È possibile ottenere l'output di quel comando e inserirlo in una variabile. quindi utilizzare heredoc. per esempio:

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

può essere scritto come:

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

e così (questo è quello che vuoi):

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

Esempio pratico in busyboxsotto dockercontainer:

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!

... o echo 'text' | ncche è ancora più breve.
phil294

2

fallo nel modo più semplice,

direc=$(basename `pwd`)

O usa la shell

$ direc=${PWD##*/}

1

Un altro motivo dell'errore potrebbe essere se si sta eseguendo un processo cron che aggiorna una copia di lavoro di sovversione e quindi ha tentato di eseguire uno script con versione che era in conflitto dopo l'aggiornamento ...


1

Sulla mia macchina, se eseguo direttamente uno script, il valore predefinito è bash.

Se lo eseguo con sudo, l'impostazione predefinita è sh.

Ecco perché stavo colpendo questo problema quando l'ho usato sudo.


0

Nel mio caso l'errore è perché ho messo ">>" due volte

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

ho appena corretto come

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

0

Prima di eseguire lo script, è necessario controllare la prima riga dello script della shell per l'interprete.

Ad esempio: se gli script iniziano con / bin / bash, esegui lo script utilizzando il comando "bash script_name.sh" riportato di seguito

se lo script inizia con / bin / sh, esegui lo script usando il comando "sh script_name.sh" riportato di seguito

./sample.sh - Questo rileverà l'interprete dalla prima riga dello script ed eseguirà.

Diverse distribuzioni Linux con shell diverse come impostazione predefinita.


1
Sebbene ti ringraziamo per la tua risposta, sarebbe meglio se fornisse un valore aggiuntivo rispetto alle altre risposte. In questo caso, la tua risposta non fornisce un valore aggiuntivo, poiché un altro utente ha già pubblicato quella soluzione. Se una risposta precedente ti è stata utile, dovresti votarla invece di ripetere le stesse informazioni.
Toby Speight,

Non pensi che ho spiegato la soluzione qui con un esempio?
Sijeesh,

C'è qualcosa qui che non è adeguatamente trattato nella risposta di John Kugelman scritta 8 anni fa?
Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.