Wenn bash mit dem Namen aufgerufen wird sh
, geschieht Folgendes :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
und setzt die POSIXLY_CORRECT
Shell-Variable später aufy
:
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
Calls bind_variable_internal
, die, wenn das Shell-Attribut a
zur Zeit aktiviert ist (was der Fall wäre, wenn Sie die Shell mit aufrufen -a
), die Shell-Variable als exportiert markieren .
Also in deinem ersten Drehbuch:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sed
wird POSIXLY_CORRECT=y
in seiner Umgebung mit aufgerufen , worüber es sich beschwert [\d001-\d008]
. (Dasselbe passiert, wenn sed die --posix
Option erhält .)
In GNU Sed, wird ein Escape - Code für das Zeichen , dessen Zahlenwert in der Basis-10 ist NNN , aber in der POSIX - Modus ist dies innerhalb einer Klammerausdruck Behinderte, so , bedeutet wörtlich die Zeichen , usw., wobei der Bereich ist von zu . Kommt in der Reihenfolge der Zeichencodes vor (und der Bereich umfasst alle Ziffern außer Null sowie alle Großbuchstaben und einige Sonderzeichen). In dem Gebietsschema, das Sie verwendet haben, wird jedoch zuvor sortiert , sodass der Bereich ungültig ist.\dNNN
[\d001-\d008]
\
d
1
\
1
\
en_US.UTF-8
\
1
In Ihrem zweiten Skript:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Obwohl POSIXLY_CORRECT
es in der Shell festgelegt ist, wird es nicht exportiert, sodass sed ohne POSIXLY_CORRECT
in der Umgebung aufgerufen wird und sed mit GNU-Erweiterungen ausgeführt wird.
Wenn Sie export POSIXLY_CORRECT
in der Nähe des oberen Bereichs Ihres zweiten Skripts hinzufügen , werden Sie auch sed bemängeln sehen.
sh
sind gleich. Auch sind nicht alle sed gleich. Welches verwendensh
Sie? In welchem Betriebssystem? und welche sed (vielleicht?sed --version
wenn es nicht scheitert)?