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?
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"]
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.
faites-le plus simplement,
direc=$(basename `pwd`)
Ou utilisez la coquille
$ direc=${PWD##*/}
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!
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 ...
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
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.
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
.
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.