Lorsque bash est appelé avec le nom sh
, il fait ceci :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
puis définitPOSIXLY_CORRECT
y
plus tard la variable shell sur :
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
appels bind_variable_internal
, qui, si l'attribut shell a
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:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sed
est invoqué avec POSIXLY_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:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
même s'il POSIXLY_CORRECT
est défini dans le shell, il n'est pas exporté, donc sed est invoqué sans POSIXLY_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.
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)?