web-dev-qa-db-fra.com

Bash: erreur de syntaxe: redirection inattendue

Je le fais dans un script:

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

et je reçois:

Syntax error: redirection unexpected

dans une machine Ubuntu

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

alors que je ne reçois pas cette erreur dans une autre machine suse:

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

Pourquoi l'erreur?

105
flow

Votre script fait-il référence à /bin/bash ou /bin/sh dans sa ligne de hachage? Le shell système par défaut dans Ubuntu est dash , pas bash , donc si vous avez #!/bin/sh, votre script utilisera un shell différent de celui auquel vous vous attendez. Dash n'a pas l'opérateur de redirection <<<.

182
John Kugelman

Docker:

J'ai eu ce problème de mon Dockerfile comme je l'avais fait:

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

Cependant, selon ce problème , il a été résolu:

La forme exec permet d’éviter la conversion de chaîne dans le shell, et to RUN en utilisant une image de base qui ne contient pas /bin/sh.

Remarque

Pour utiliser un autre shell, autre que /bin/sh, utilisez le formulaire exec en passant dans la coquille désirée. Par exemple,

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

Solution:

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

Remarquez les guillemets autour du paramètre each.

11
kemicofa

faites-le plus simplement,

direc=$(basename `pwd`)

Ou utilisez la coquille

$ direc=${PWD##*/}
2
ghostdog74

Vous pouvez obtenir le résultat de cette commande et le placer dans une variable. puis utilisez heredoc. par exemple:

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

peut être écrit comme:

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

et comme ça (c'est ce que vous voulez):

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

Exemple pratique dans busybox sous docker conteneur:

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!
1
TechJS

Une autre raison de l'erreur peut être si vous exécutez un travail cron qui met à jour une copie de travail Subversion, puis a tenté d'exécuter un script traité en version qui était en conflit après la mise à jour ... 

1
Motin

Dans mon cas, l'erreur est due au fait que j'ai mis ">>" deux fois 

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

je viens de le corriger comme 

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

Avant d'exécuter le script, vous devez vérifier la première ligne du script Shell pour l'interpréteur.

Exemple: Si les scripts commencent par/bin/bash, exécutez-le à l'aide de la commande ci-dessous "Bash nom_script.sh"

si le script commence par/bin/sh, exécutez-le à l'aide de la commande ci-dessous "sh nom_script.sh"

./sample.sh - Ceci détectera l'interpréteur à partir de la première ligne du script et sera exécuté.

Différentes distributions Linux ayant différents shells par défaut.

0
SjK

Sur ma machine, si j'exécute directement un script, la valeur par défaut est bash.

Si je l'exécute avec Sudo, la valeur par défaut est sh.

C’est pourquoi j’ai eu ce problème lorsque j’ai utilisé Sudo.

0
Michael Mather

Si vous utilisez les éléments suivants pour exécuter votre script:

Sudo sh ./script.sh

Ensuite, vous voudrez utiliser les éléments suivants à la place:

Sudo bash ./script.sh

La raison en est que Bash n'est pas le shell par défaut pour Ubuntu. Donc, si vous utilisez "sh", il utilisera simplement le shell par défaut; qui est en fait Dash. Cela se produira même si vous avez #!/bin/bash en haut de votre script. Par conséquent, vous devrez spécifier explicitement d'utiliser bash comme indiqué ci-dessus et votre script doit s'exécuter comme prévu.

Dash ne prend pas en charge les redirections de la même manière que Bash.

0
Chris Pietschmann