Коли 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]\d1\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якщо він не виходить з ладу)?