Khi bash được gọi với tên sh, nó thực hiện điều này :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
và sau đó đặt POSIXLY_CORRECTbiến shell thànhy :
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variablecác lệnh gọi bind_variable_internal, nếu thuộc tính shell ađược bật tại thời điểm đó (sẽ là nếu bạn gọi shell với -a), đánh dấu biến shell là xuất .
Vì vậy, trong kịch bản đầu tiên của bạn:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sedđược viện dẫn POSIXLY_CORRECT=ytrong môi trường của nó, điều này sẽ khiến nó phàn nàn [\d001-\d008]. (Điều tương tự xảy ra nếu sed được cung cấp --posixtùy chọn.)
Trong GNU sed, là escape code cho nhân vật có giá trị số trong cơ số 10 là NNN , nhưng trong chế độ POSIX, đây là khuyết tật bên trong một biểu thức khung, vì vậy , có nghĩa là theo nghĩa đen các nhân vật , vv, với phạm vi là từ để . Theo thứ tự mã ký tự, xuất hiện trước (và phạm vi bao gồm tất cả các chữ số trừ số 0, cộng với tất cả các chữ cái viết hoa, cộng với một số ký tự đặc biệt). Tuy nhiên, trong ngôn ngữ mà bạn đang sử dụng, hãy sắp xếp trước , vì vậy phạm vi không hợp lệ.\dNNN[\d001-\d008]\d1\1\en_US.UTF-8\1
Trong kịch bản thứ hai của bạn:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
mặc dù POSIXLY_CORRECTđược đặt trong trình bao, nó không được xuất, vì vậy sed được gọi mà không có POSIXLY_CORRECTtrong môi trường và sed chạy với các phần mở rộng GNU.
Nếu bạn thêm export POSIXLY_CORRECTgần đầu tập lệnh thứ hai của mình, bạn cũng sẽ thấy sed phàn nàn.
shđều giống nhau. Cũng không phải tất cả sed đều tương đương. Bạnshđang sử dụng cái gì Trong hệ điều hành nào? và sed nào (có thể?sed --versionnếu nó không thất bại)?