जब नाम के साथ बैश कहा जाता है 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'
sedPOSIXLY_CORRECT=yइसके वातावरण के साथ लागू किया जाता है, जो इसके बारे में शिकायत करेगा [\d001-\d008]। (अगर सीड को --posixविकल्प दिया जाता है तो समान बात होती है ।)
जीएनयू sed में, चरित्र जिसका संख्यात्मक मूल्य में पलायन कोड है आधार -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शेल में सेट किया गया हो, लेकिन इसका निर्यात नहीं किया जाता है, इसलिए सेड को बिना POSIXLY_CORRECTपर्यावरण के लगाया जाता है, और सेडू GNU एक्सटेंशन के साथ चलता है।
यदि आप export POSIXLY_CORRECTअपनी दूसरी स्क्रिप्ट के शीर्ष के पास जोड़ते हैं , तो आपको sed शिकायत दिखाई देगी।
shसमान नहीं हैं। और न ही सभी सेड बराबर हैं। जोshआप उपयोग कर रहे हैं? किस OS में? और कौन सा sed (हो सकता है?sed --versionयदि यह विफल नहीं है)?