Si j'exécute le fichier .sh suivant:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Le résultat est une erreur:
sed: -e expression # 1, caractère 18: fin de plage non valide
Mais si j'exécute le fichier .sh suivant:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Il s'exécute sans erreur. Le deuxième code n'est-il pas censé être équivalent au premier? Pourquoi l'erreur dans la première?
shell-script
shell
sed
options
Rodrigo
la source
la source
sh
sont pas pareils. Tous les sed ne sont pas équivalents non plus. Lequelsh
utilisez-vous? Dans quel OS? et quel sed (peut-être?sed --version
si ça ne manque pas)?LC_COLLATE=C
(ouPOSIX
) de l'appel poursed
contourner le problèmePOSIXLY_CORRECT=y
dans l'environnement, le second n'en a pasPOSIXLY_CORRECT
dans l'environnement. Le shell à partir duquel j'appelle les deux scripts n'a pasPOSIXLY_CORRECT
dans son environnement.echo "a" | POSIXLY_CORRECT=y sed -e 's/[\d001-\d008]//g'
reproduisez votre problèmeRéponses:
Lorsque bash est appelé avec le nom
sh
, il fait ceci :puis définit
POSIXLY_CORRECT
y
plus tard la variable shell sur :bind_variable
appelsbind_variable_internal
, qui, si l'attribut shella
est activé à ce moment (ce qui serait le cas si vous appeliez le shell-a
), marque la variable shell comme exportée .Donc dans votre premier script:
sed
est invoqué avecPOSIXLY_CORRECT=y
dans son environnement, ce qui le fera se plaindre[\d001-\d008]
. (La même chose se produit si sed a la--posix
possibilité.)Dans GNU sed, est un code d'échappement pour le caractère dont la valeur numérique de base 10 est NNN , mais en mode POSIX, cette option est désactivée dans une expression de support, donc , signifie littéralement les personnages , etc., la gamme étant de à . Dans l'ordre des codes de caractères, vient avant (et la plage comprend tous les chiffres sauf zéro, plus toutes les lettres majuscules, plus quelques caractères spéciaux). Dans les paramètres régionaux que vous utilisiez, les tris avant , cependant, de sorte que la plage n'est pas valide.
\dNNN
[\d001-\d008]
\
d
1
\
1
\
en_US.UTF-8
\
1
Dans votre deuxième script:
même s'il
POSIXLY_CORRECT
est défini dans le shell, il n'est pas exporté, donc sed est invoqué sansPOSIXLY_CORRECT
dans l'environnement, et sed s'exécute avec des extensions GNU.Si vous ajoutez en
export POSIXLY_CORRECT
haut de votre deuxième script, vous verrez également sed se plaindre.la source
/bin/sh
fait d' être Bash). La même chose se produit si sePOSIXLY_CORRECT
trouve dans l'environnement avant lesh
démarrage de Bash: il le transmettra également en tant quePOSIXLY_CORRECT=y
.POSIXLY_CORRECT
n'est pas dans l'environnement au démarrage du shell et le script ne le définit pas. La coquille fait. Il crée une variable d'environnement de nulle part, ce qui est extrêmement mauvais car il le fait dans un mode où il est censé être, et essaie d'être conforme aux normes.POSIXLY_CORRECT
de lui-même. Il n'y en a aucune mention dans la liste des effets du mode POSIX et la description de la variable dit seulement que le paramétrer fait passer le shell en mode POSIX, et non l'inverse.allexport
.