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_CORRECT
biến shell thànhy
:
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
cá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=y
trong 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 --posix
tù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]
\
d
1
\
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_CORRECT
trong 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_CORRECT
gầ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 --version
nếu nó không thất bại)?