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_CORRECTShell-Variable später aufy :
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variableCalls bind_variable_internal, die, wenn das Shell-Attribut azur 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'
sedwird POSIXLY_CORRECT=yin seiner Umgebung mit aufgerufen , worüber es sich beschwert [\d001-\d008]. (Dasselbe passiert, wenn sed die --posixOption 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]\d1\1\en_US.UTF-8\1
In Ihrem zweiten Skript:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Obwohl POSIXLY_CORRECTes in der Shell festgelegt ist, wird es nicht exportiert, sodass sed ohne POSIXLY_CORRECTin der Umgebung aufgerufen wird und sed mit GNU-Erweiterungen ausgeführt wird.
Wenn Sie export POSIXLY_CORRECTin der Nähe des oberen Bereichs Ihres zweiten Skripts hinzufügen , werden Sie auch sed bemängeln sehen.
shsind gleich. Auch sind nicht alle sed gleich. Welches verwendenshSie? In welchem Betriebssystem? und welche sed (vielleicht?sed --versionwenn es nicht scheitert)?