เมื่อ 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]\d1\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ถ้ามันไม่ล้มเหลว)