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_CORRECT
variabile shell suy
:
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
chiamate 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'
sed
viene invocato POSIXLY_CORRECT=y
nel suo ambiente, il che lo farà lamentare [\d001-\d008]
. (La stessa cosa accade se a sed viene data l' --posix
opzione.)
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]
\
d
1
\
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_CORRECT
nell'ambiente e sed funziona con estensioni GNU.
Se aggiungi export POSIXLY_CORRECT
vicino all'inizio del secondo script, vedrai anche lamentarsi.
sh
sono uguali. Né tutti i sed sono equivalenti. Chesh
stai usando? In quale sistema operativo? e quale sed (forse?sed --version
se non fallisce)?