เมื่อ bash ถูกเรียกด้วยชื่อsh
มันจะทำสิ่งนี้ :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
จากนั้นตั้งค่าPOSIXLY_CORRECT
ตัวแปรของเชลล์เป็นy
:
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
โทรbind_variable_internal
ซึ่งหากแอตทริบิวต์เปลือกa
คือในเวลา (ซึ่งมันจะเป็นถ้าคุณเรียกเปลือกด้วย-a
) เครื่องหมายเปลือกเป็นตัวแปรที่ส่งออก
ดังนั้นในสคริปต์แรกของคุณ:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sed
ถูกเรียกด้วยPOSIXLY_CORRECT=y
ในสภาพแวดล้อมของ บริษัท [\d001-\d008]
ซึ่งจะทำให้มันบ่นเกี่ยวกับ (สิ่งเดียวกันจะเกิดขึ้นหากมี--posix
ตัวเลือก)
ใน GNU sed, เป็นรหัสหลบหนีสำหรับตัวอักษรที่มีค่าตัวเลขในฐาน-10 มมมมแต่ในโหมด POSIX นี้เป็นคนพิการภายในแสดงออกวงเล็บจึงหมายถึงตัวอักษรตัวอักษร, ฯลฯ กับช่วงมาจากไปยัง ตามลำดับของรหัสตัวอักษรมาก่อน(และช่วงจะรวมตัวเลขทั้งหมดยกเว้นศูนย์รวมทั้งตัวอักษรตัวพิมพ์ใหญ่ทั้งหมดรวมทั้งอักขระพิเศษบางตัว) อย่างไรก็ตามในภาษาที่คุณใช้เรียงลำดับก่อนหน้าดังนั้นช่วงนั้นไม่ถูกต้อง\dNNN
[\d001-\d008]
\
d
1
\
1
\
en_US.UTF-8
\
1
ในสคริปต์ที่สองของคุณ:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
แม้ว่าPOSIXLY_CORRECT
จะตั้งค่าไว้ในเชลล์ แต่ก็ไม่ได้ถูกส่งออกดังนั้น sed จึงถูกเรียกใช้โดยไม่POSIXLY_CORRECT
อยู่ในสภาพแวดล้อมและทำงานโดยใช้ส่วนขยาย GNU
หากคุณเพิ่มexport POSIXLY_CORRECT
ใกล้ด้านบนสุดของสคริปต์ที่สองของคุณคุณจะเห็นว่าบ่น
sh
เหมือนกันทั้งหมด ไม่ว่าทั้งหมดจะเทียบเท่า ซึ่งsh
ที่คุณใช้? ระบบปฏิบัติการใด? และอันไหน (อาจจะ?sed --version
ถ้ามันไม่ล้มเหลว)