आप, एक #!
लाइन पर एक से अधिक तर्क नहीं दे सकते हैं । इसका मतलब है कि केवल एक पूर्ण पथ और एक तर्क (जैसे #!/bin/sed -f
या #!/usr/bin/sed -f
), या #!/usr/bin/env
दुभाषिया का कोई तर्क नहीं।
एक पोर्टेबल स्क्रिप्ट प्राप्त करने के लिए एक वर्कअराउंड का उपयोग करना है #!/bin/sh
और एक शेल-रैपर, कमांड-लाइन तर्क के रूप में सेड स्क्रिप्ट को पास करना है। ध्यान दें कि यह POSIX द्वारा अनुमोदित नहीं है ( -e
पोर्टेबिलिटी के लिए प्रत्येक निर्देश के लिए एक अलग तर्क के साथ बहु-निर्देश स्क्रिप्ट को लिखा जाना चाहिए ), लेकिन यह कई कार्यान्वयनों के साथ काम करता है।
#!/bin/sh
exec sed '
s/a/b/
' "$@"
एक लंबी स्क्रिप्ट के लिए, एक हेरेडोक का उपयोग करना अधिक सुविधाजनक हो सकता है। एक वंशानुगत का एक फायदा यह है कि आपको किसी भी उद्धरण को अंदर उद्धृत करने की आवश्यकता नहीं है, यदि कोई हो। एक प्रमुख नकारात्मक पक्ष यह है कि स्क्रिप्ट को इसके मानक इनपुट पर दो कष्टप्रद परिणामों के साथ sed करने के लिए खिलाया जाता है। सीड के कुछ संस्करणों की आवश्यकता होती -f /dev/stdin
है -f -
, जो पोर्टेबिलिटी के लिए एक समस्या है। इससे भी बदतर, स्क्रिप्ट एक फिल्टर के रूप में कार्य नहीं कर सकती है, क्योंकि मानक इनपुट स्क्रिप्ट है और डेटा नहीं हो सकता है।
#!/bin/sh
exec sed -f - -- "$@" <<'EOF'
s/a/b/
EOF
हेरेडोक के नकारात्मक पक्ष को एक उपयोगी उपयोग द्वारा सुधारा जा सकता है cat
। चूंकि यह पूरी स्क्रिप्ट को फिर से कमांड लाइन पर रखता है, इसलिए यह POSIX- अनुरूप नहीं है, लेकिन मोटे तौर पर व्यवहार में पोर्टेबल है।
#!/bin/sh
exec sed "$(cat <<'EOF')" -- "$@"
s/a/b/
EOF
एक और वर्कअराउंड एक स्क्रिप्ट लिखना है जिसे sh और sed दोनों द्वारा पार्स किया जा सकता है। यह पोर्टेबल है, उचित रूप से कुशल है, बस थोड़ा बदसूरत है।
#! /bin/sh
b ()
{
x
}
i\
f true; then exec sed -f "$0" "$@"; fi
: ()
# sed script starts here
s/a/b/
स्पष्टीकरण:
- श के तहत: एक फ़ंक्शन को परिभाषित करना
b
; जब तक फ़ंक्शन सिंटैक्टली रूप से अच्छी तरह से गठित नहीं हो जाता है तब तक कोई फर्क नहीं पड़ता (विशेष रूप से, आपके पास खाली फ़ंक्शन नहीं हो सकता)। फिर अगर सच (यानी हमेशा), sed
स्क्रिप्ट पर अमल करें।
- सेड के तहत:
()
लेबल की शाखा , फिर कुछ सुव्यवस्थित इनपुट। फिर एक i
कमांड, जिसका कोई प्रभाव नहीं है क्योंकि यह हमेशा स्किप हो जाता है। अंत में ()
स्क्रिप्ट के उपयोगी भाग के बाद लेबल।
- जीएनयू सेड, बिजीबॉक्स और ओपनबीएसडी के तहत परीक्षण किया गया। (आप GNU sed पर कुछ सरल के साथ दूर हो सकते हैं, लेकिन OpenBSD sed, उन भागों के बारे में उपयुक्त है जो इसे छोड़ देता है।)