Коли 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]
. (Те саме відбувається, якщо sed надається --posix
опція.)
У ГНУ СЕД, є кодом виходу для символу якого чисельне значення в базі-10 NNN , але в режимі 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
середовища, а sed працює з розширеннями GNU.
Якщо ви додасте export POSIXLY_CORRECT
біля верхньої частини другого сценарію, ви також побачите sed скарги.
sh
однакові. Не всі sed є рівнозначними. Щоsh
ви використовуєте? У якій ОС? і Який сід (можливо?sed --version
якщо він не виходить з ладу)?