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