macOS पर किसी शेल स्क्रिप्ट में स्पेस वाले फ़ाइल नाम को पास करने के लिए, स्क्रिप्ट चलाते समय पाथ को एक तर्क के रूप में कोट करें, फिर स्क्रिप्ट के अंदर "$1" का उपयोग करें। उदाहरण के लिए, ./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf" एक फ़ाइल नाम पास करता है; बिना कोट्स के, शेल इसे कई तर्कों में विभाजित कर देता है। यह तरीका सही ढंग से कोट किए जाने पर अन्य शेल-संवेदनशील वर्णों वाले पाथ के साथ भी काम करता है।
पाथ को एक तर्क के रूप में रखकर स्क्रिप्ट चलाएं
Terminal में, पूरी फ़ाइल के नाम या पाथ के चारों ओर (इसकी डायरेक्ट्रीज़ सहित) डबल कोट्स लगाएं, और स्क्रिप्ट के नाम को अलग रखें:
./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf"
सरल टाइप किए गए पाथ के लिए प्रत्येक स्पेस से पहले बैकस्लैश भी काम करता है: ./process-file.sh /Users/sam/Documents/Quarterly\ Report.pdf। पूरे पाथ को कोट करना पढ़ने में आसान होता है और इसमें त्रुटि की संभावना कम होती है, खासकर तब जब इसमें कई स्पेस हों। कोट्स शेल सिंटैक्स होते हैं; वे पाथ को एक तर्क में समूहित करते हैं और स्क्रिप्ट द्वारा प्राप्त किए गए फ़ाइल नाम का हिस्सा नहीं होते हैं। शेल एक्सपेंशन के बाद शब्दों को विभाजित (word splitting) करता है, इसलिए बिना कोट किया गया पाथ स्पेस पर विभाजित हो सकता है। Bash Reference Manual: Quoting
यदि फ़ाइल वर्तमान डायरेक्ट्री में है, तो रिलेटिव पाथ भी काम करता है:
./process-file.sh "Quarterly Report.pdf"
पाथ को उस डायरेक्ट्री से एक मौजूदा फ़ाइल की ओर इंगित करना चाहिए जहाँ से आप कमांड चलाते हैं। यदि स्क्रिप्ट स्वयं निष्पादन योग्य (executable) नहीं है, तो इसके बजाय इसे किसी शेल के साथ इनवोक करें, उदाहरण के लिए bash process-file.sh "/Users/sam/Documents/Quarterly Report.pdf"। दोनों में से कोई भी रूप पाथ को एक तर्क के रूप में पास करता है; स्क्रिप्ट को फ़ाइल के लिए पढ़ने की अनुमति (read permission) की आवश्यकता होती है और इसे किसी भी अन्य आवश्यक अनुमतियों को संभालना चाहिए।
स्क्रिप्ट के अंदर तर्क का सुरक्षित रूप से उपयोग करें
इसे process-file.sh के रूप में सहेजें:
#!/bin/bash
if [ "$#" -ne 1 ]; then
printf 'Usage: %s FILE\n' "$0" >&2
exit 2
fi
file=$1
if [ ! -f "$file" ]; then
printf 'Not a regular file: %s\n' "$file" >&2
exit 1
fi
printf 'Received one file: %s\n' "$file"
स्क्रिप्ट जाँचती है कि उसे ठीक एक तर्क प्राप्त हुआ है, जाँचती है कि पाथ एक सामान्य फ़ाइल को इंगित करता है, और प्राप्त पाथ को प्रिंट करती है। $# तर्कों की संख्या है; $1 पहला तर्क है। किसी कमांड को पाथ पास करते समय या किसी परीक्षण में इसका उपयोग करते समय वेरिएबल एक्सपेंशन को कोटेड रखें—"$file"। अन्यथा शेल स्पेस वाले मान को अलग-अलग शब्दों में विभाजित कर सकता है और वाइल्डकार्ड वर्णों को फ़ाइल नाम पैटर्न के रूप में मान सकता है। Bash मैनुअल स्थितीय पैरामीटर्स (positional parameters) और शेल के वर्ड-स्प्लिटिंग और फ़ाइलनाम-एक्सपेंशन चरणों का दस्तावेजीकरण करता है। Bash Reference Manual: Positional Parameters and Shell Expansions
एकाधिक फ़ाइल नामों को प्रोसेस करने के लिए, स्क्रिप्ट को इनवोक करते समय प्रत्येक पाथ को कोट करें, और "$@" पर लूप चलाएं ताकि प्रत्येक तर्क अलग रहे:
for file in "$@"; do
printf 'Received: %s\n' "$file"
done
इस उद्देश्य के लिए $* या बिना कोट किए गए $@ का उपयोग न करें: ये तर्क मानों को जोड़ या विभाजित कर सकते हैं। यदि स्क्रिप्ट को केवल एक फ़ाइल की अपेक्षा है, तो एक-तर्क वाली जाँच रखें और एक कोटेड पाथ पास करें।
जब AppleScript शेल कमांड लॉन्च करता है
एक AppleScript do shell script कमांड शेल कोड युक्त टेक्स्ट स्ट्रिंग लेता है। यदि आप किसी पाथ को सीधे उस कमांड में जोड़ते हैं (concatenate करते हैं), तो /Users/sam/Quarterly Reports/report.pdf जैसे पाथ की व्याख्या कई शेल शब्दों के रूप में की जाती है। Apple quoted form को शेल व्याख्या के लिए सुरक्षित टेक्स्ट बनाने के तरीके के रूप में प्रलेखित करता है, जिसमें स्पेस और एम्बेडेड कोट वर्णों वाली स्ट्रिंग शामिल हैं। Apple: Calling Command-Line Tools
किसी ज्ञात पाथ के लिए, इसे जोड़ने से पहले quoted form of के साथ कोट करें:
set filePath to "/Users/sam/Quarterly Reports/report.pdf"
set safePath to quoted form of filePath
do shell script "/path/to/process-file.sh " & safePath
परिणामी कमांड स्क्रिप्ट को एक पाथ तर्क देता है। यदि पाथ किसी फ़ाइल चयनकर्ता (file chooser) से आता है, तो चुनी गई वस्तु को पहले POSIX पाथ में बदलें, फिर उसे कोट करें:
set filePath to POSIX path of (choose file)
do shell script "/path/to/process-file.sh " & quoted form of filePath
Apple का AppleScript संदर्भ एक चुने गए फ़ोल्डर के लिए इस पैटर्न को प्रदर्शित करता है और नोट करता है कि quoted form एम्बेडेड सिंगल कोट्स को भी संभालता है। AppleScript Language Guide: Commands Reference
सामान्य विफलताओं को ठीक करें
यदि स्क्रिप्ट रिपोर्ट करती है कि उसे कई तर्क प्राप्त हुए हैं, तो उसे लॉन्च करने वाले कमांड की जाँच करें: पूरा पाथ कोट्स के एक जोड़े के अंदर होना चाहिए। यदि यह शाब्दिक उद्धरण चिह्नों (literal quote marks) वाला पाथ प्राप्त करता है, तो जाँचें कि क्या वे चिह्न फ़ाइल नाम स्ट्रिंग में ही शामिल थे; शेल कोट्स को तर्क को समूहित करना चाहिए, उसके मान का हिस्सा नहीं बनना चाहिए।
यदि स्क्रिप्ट पाथ को सही ढंग से प्राप्त करती है लेकिन बाद का कोई कमांड विफल हो जाता है, तो उस कमांड के तर्कों की भी जाँच करें। लॉन्च कमांड को कोट करने से स्क्रिप्ट के अंदर बिना कोट किया गया वेरिएबल अपने आप सुरक्षित नहीं होता है: some-command "$file" जैसे रूपों का उपयोग करें। AppleScript के लिए, पाथ के चारों ओर हाथ से कोट्स न जोड़ें; शेल कमांड में पाथ का quoted form of जोड़ें। यह केवल शेल पार्सिंग को संबोधित करता है। यह किसी अमान्य पाथ को अस्तित्व में नहीं लाता है, फ़ाइल एक्सेस प्रदान नहीं करता है, या यह गारंटी नहीं देता है कि कॉल किया गया प्रोग्राम फ़ाइल को स्वीकार करता है।
स्रोत
Bash Reference Manual: Quoting — GNU Project
Bash Reference Manual — GNU Project
Mac Automation Scripting Guide: Calling Command-Line Tools — Apple
Commands Reference — Apple