Lorsque j'utilise le code ci-dessous dans le terminal SSH pour CentOS, cela fonctionne bien:
paste <(printf "%s\n" "TOP")
Mais si je place le même code de ligne dans un script shell (test.sh) et que j'exécute un script shell à partir du terminal, cela génère une erreur comme ceci
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
Comment puis-je résoudre ce problème?
dash
au lieu debash
).#!/bin/sh
au sommet. J'ai exécuté commebash test.sh
mais ça n'a pas marché non plus.bash
en mode POSIX ne prend pas en charge cette syntaxe non plus (lorsqu'elle est appelée avec--posix
ou en tant que/bin/sh
). Utilisez#!/bin/bash
.POSIXLY_CORRECT
défini des variables lorsque vous démarrezbash
?#!/bin/bash
haut a résolu le problème.Réponses:
La substitution de processus n'est pas spécifié par POSIX, donc pas tous POSIX le soutenir, seuls quelques coquilles comme
bash
,zsh
,ksh88
,ksh93
soutien.Dans le
Centos
système,/bin/sh
est un lien symbolique vers/bin/bash
. Lorsquebash
est invoqué avec un nomsh
,bash
passe en mode posix ( Bash Startup Files - Appelé avec un nom sh ). En mode posix,process substitution
n'est pas pris en charge, provoque une erreur de syntaxe.Le script devrait fonctionner, si vous appelez
bash
directementbash test.sh
. Sinon, ilbash
est peut-être entré en mode posix. Cela peut se produire si vous commencezbash
avec un--posix
argument ou une variablePOSIXLY_CORRECT
définie aubash
démarrage:Ou
bash
est construit avec--enable-strict-posix-default
option.Ici, vous n'avez pas besoin de substitution de processus, vous pouvez utiliser des tubes shell standard:
-
est le moyen standard de direpaste
de lire les données de stdin. Avec certainespaste
implémentations, vous pouvez l'omettre bien que ce ne soit pas standard.Il serait utile de coller la sortie de plusieurs commandes comme dans:
Sur les systèmes qui prennent en charge
/dev/fd/n
, cela peut être faitsh
avec:(c'est ce qui
<(...)
fait en interne).la source
Voici une autre solution de contournement. Au lieu d'exécuter la commande, exécutez bash et passez la commande à bash en utilisant -c:
la source