Bash adıyla çağrıldığında shbunu yapar :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
ve daha sonra shell değişkenini şu şekilde ayarlarPOSIXLY_CORRECTy :
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variablearamalar bind_variable_internal, hangi kabuk niteliği ise a(eğer birlikte kabuk çağrılan eğer olacağını anda açık -a), işaretleri olarak kabuk değişkeni ihraç .
İlk betiğinizde:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sedile çağrılır POSIXLY_CORRECT=yonu şikayet yapacak çevresiyle, içinde [\d001-\d008]. (Sed --posixseçeneğine sahipse aynı şey olur .)
GNU sed olarak, sayısal değer olarak bir karakter için bir çıkış kodu olan bir baz-10 NNN , ancak POSIX modunda, bu yüzden bir dirsek ifade içinde devre dışı , kelimenin tam anlamıyla araçlar karakterler , aralık ise, vs. için . Karakter kodları sırasına göre önce gelir (ve aralık, sıfır hariç tüm rakamları, ayrıca tüm büyük harfleri ve bazı özel karakterleri içerir). Gelen kullanmakta olduğunuz yerel ayarı, daha önce sıralar aralığı geçersiz böylece Ancak.\dNNN[\d001-\d008]\d1\1\en_US.UTF-8\1
İkinci komut dosyanızda:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
POSIXLY_CORRECTKabukta ayarlanmış olmasına rağmen , dışa aktarılmaz, bu nedenle sed POSIXLY_CORRECTortamda olmadan çağrılır ve sed GNU uzantılarıyla çalışır.
export POSIXLY_CORRECTİkinci senaryonuzun üst kısmına eklerseniz sed şikayetini de görürsünüz.
shaynı değil. Ne de tüm sed eşdeğerdir. Hangisinishkullanıyorsun? Hangi işletim sisteminde? ve Hangi sed (belki?sed --versionbaşarısız değilse)?