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_CORRECTvariabel shell key :
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variablepanggilan bind_variable_internal, yang, jika atribut shell aaktif 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'
seddipanggil dengan POSIXLY_CORRECT=ydi lingkungannya, yang akan membuatnya mengeluh [\d001-\d008]. (Hal yang sama terjadi jika sed diberikan --posixopsi.)
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]\d1\1\en_US.UTF-8\1
Dalam skrip kedua Anda:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
meskipun POSIXLY_CORRECTdiatur dalam shell, itu tidak diekspor, jadi sed dipanggil tanpa POSIXLY_CORRECTdi lingkungan, dan sed berjalan dengan ekstensi GNU.
Jika Anda menambahkan di export POSIXLY_CORRECTdekat bagian atas skrip kedua, Anda juga akan melihat keluhan.
shsama. Tidak semua sed setara. Yangshkamu gunakan Di OS mana? dan yang sed (mungkin?sed --versionjika tidak gagal)?