Quando bash viene chiamato con il nome sh, lo fa :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
e successivamente imposta la POSIXLY_CORRECTvariabile shell suy :
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variablechiamate bind_variable_internal, che, se l'attributo shell aè attivo al momento (come sarebbe se invocassi la shell -a), contrassegna la variabile shell come esportata .
Quindi nel tuo primo script:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sedviene invocato POSIXLY_CORRECT=ynel suo ambiente, il che lo farà lamentare [\d001-\d008]. (La stessa cosa accade se a sed viene data l' --posixopzione.)
In GNU sed, è un codice di escape per il carattere il cui valore numerico in base 10 è NNN , ma in modalità POSIX, questo è disabilitato all'interno un'espressione staffa, quindi , significa letteralmente i caratteri , ecc, con l'intervallo essendo da a . In ordine di codici di caratteri, viene prima (e l'intervallo include tutte le cifre tranne zero, più tutte le lettere maiuscole e alcuni caratteri speciali). Nelle impostazioni internazionali che stavi utilizzando, ordina prima , tuttavia, l'intervallo non è valido.\dNNN[\d001-\d008]\d1\1\en_US.UTF-8\1
Nel tuo secondo script:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
anche se POSIXLY_CORRECTè impostato nella shell, non viene esportato, quindi sed viene invocato senza POSIXLY_CORRECTnell'ambiente e sed funziona con estensioni GNU.
Se aggiungi export POSIXLY_CORRECTvicino all'inizio del secondo script, vedrai anche lamentarsi.
shsono uguali. Né tutti i sed sono equivalenti. Cheshstai usando? In quale sistema operativo? e quale sed (forse?sed --versionse non fallisce)?