Bash adıyla çağrıldığında sh
bunu 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_CORRECT
y
:
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
aramalar 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'
sed
ile çağrılır POSIXLY_CORRECT=y
onu şikayet yapacak çevresiyle, içinde [\d001-\d008]
. (Sed --posix
seç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]
\
d
1
\
1
\
en_US.UTF-8
\
1
İkinci komut dosyanızda:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
POSIXLY_CORRECT
Kabukta ayarlanmış olmasına rağmen , dışa aktarılmaz, bu nedenle sed POSIXLY_CORRECT
ortamda 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.
sh
aynı değil. Ne de tüm sed eşdeğerdir. Hangisinish
kullanıyorsun? Hangi işletim sisteminde? ve Hangi sed (belki?sed --version
başarısız değilse)?