Ketika bash dipanggil dengan namanya sh
, ia melakukan ini :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
dan kemudian mengatur POSIXLY_CORRECT
variabel shell key
:
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
panggilan bind_variable_internal
, yang, jika atribut shell a
aktif pada saat itu (yang akan terjadi jika Anda memanggil shell dengan -a
), menandai variabel shell sebagai diekspor .
Jadi dalam skrip pertama Anda:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sed
dipanggil dengan POSIXLY_CORRECT=y
di lingkungannya, yang akan membuatnya mengeluh [\d001-\d008]
. (Hal yang sama terjadi jika sed diberikan --posix
opsi.)
Di GNU sed, adalah kode melarikan diri untuk karakter yang nilai numerik dalam basis-10 adalah NNN , tapi dalam modus POSIX, ini dinonaktifkan dalam ekspresi braket, sehingga , berarti harfiah karakter , dll, dengan kisaran yang dari untuk . Dalam urutan kode karakter, muncul sebelum (dan rentang mencakup semua digit kecuali nol, ditambah semua huruf besar, ditambah beberapa karakter khusus). Di lokal yang Anda gunakan, ketik sebelumnya , sehingga rentang tidak valid.\dNNN
[\d001-\d008]
\
d
1
\
1
\
en_US.UTF-8
\
1
Dalam skrip kedua Anda:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
meskipun POSIXLY_CORRECT
diatur dalam shell, itu tidak diekspor, jadi sed dipanggil tanpa POSIXLY_CORRECT
di lingkungan, dan sed berjalan dengan ekstensi GNU.
Jika Anda menambahkan di export POSIXLY_CORRECT
dekat bagian atas skrip kedua, Anda juga akan melihat keluhan.
sh
sama. Tidak semua sed setara. Yangsh
kamu gunakan Di OS mana? dan yang sed (mungkin?sed --version
jika tidak gagal)?