Wenn ich die folgende .sh-Datei ausführe:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Das Ergebnis ist ein Fehler:
sed: -e Ausdruck # 1, char 18: Ungültiges Bereichsende
Aber wenn ich die folgende .sh-Datei laufen lasse:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
Es läuft ohne Fehler. Soll der zweite Code nicht gleich dem ersten sein? Warum der Fehler im ersten?
shell-script
shell
sed
options
Rodrigo
quelle
quelle
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)?LC_COLLATE=C
(oderPOSIX
) für den Aufruf zursed
Behebung des ProblemsPOSIXLY_CORRECT=y
in der Umgebung auf, das zweite nichtPOSIXLY_CORRECT
in der Umgebung. Die Shell, von der ich beide Skripte aufgerufen habe, befindet sich nichtPOSIXLY_CORRECT
in ihrer Umgebung.echo "a" | POSIXLY_CORRECT=y sed -e 's/[\d001-\d008]//g'
reproduzieren Sie Ihr ProblemAntworten:
Wenn bash mit dem Namen aufgerufen wird
sh
, geschieht Folgendes :und setzt die
POSIXLY_CORRECT
Shell-Variable später aufy
:bind_variable
Callsbind_variable_internal
, die, wenn das Shell-Attributa
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:
sed
wirdPOSIXLY_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:
Obwohl
POSIXLY_CORRECT
es in der Shell festgelegt ist, wird es nicht exportiert, sodass sed ohnePOSIXLY_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.quelle
/bin/sh
tatsächlich zu sein Bash). Das gleiche passiert, wennPOSIXLY_CORRECT
es sich vor demsh
Start von Bash in der Umgebung befindet : Es wird auch als weitergegebenPOSIXLY_CORRECT=y
.POSIXLY_CORRECT
befindet sich jedoch nicht in der Umgebung, wenn die Shell gestartet wird , und das Skript legt dies nicht fest. Die Muschel tut es. Es erstellt eine Umgebungsvariable aus dem Nichts, was besonders schlimm ist, da es dies in einem Modus tut, in dem es sein soll, und versucht, standardkonform zu sein.POSIXLY_CORRECT
. In der Liste der Auswirkungen des POSIX-Modus wird dies nicht erwähnt, und die Beschreibung der Variablen besagt lediglich, dass durch das Festlegen der Wirkung die Shell in den POSIX-Modus versetzt wird, nicht umgekehrt.allexport
.