मैक ओएस एक्स में बैच (.command) को वर्तमान स्थान कैसे निर्दिष्ट करें


2

मेरे पास एक बैच फ़ाइल (.command) है जिसे मैं काम करने के लिए डबल क्लिक करता हूं। यह एक ही फ़ोल्डर में फ़ाइलों पर निर्भरता है, लेकिन अगर मैं डबल क्लिक करता हूँ। और फ़ाइल को केवल लॉन्च करता है और वर्तमान स्थान मानता है / ~

मैं स्क्रिप्ट में .command फ़ाइल का स्थान कैसे ढूँढूँ / निर्दिष्ट करूँ, इसलिए मैं संबंधित संपत्तियों का उल्लेख कर सकता हूँ?

जवाबों:


3

यदि आप bash (यानी स्क्रिप्ट के साथ शुरू होता है #!/bin/bash) का उपयोग कर रहे हैं , तो आप स्क्रिप्ट का फ़ाइल नाम प्राप्त करने के लिए $ BASH_SOURCE का उपयोग कर सकते हैं। उस से, आप उस निर्देशिका को प्राप्त कर सकते हैं जो इसमें है:

mydir="$(dirname "$BASH_SOURCE")"

... और फिर स्क्रिप्ट के सापेक्ष फ़ाइलें खोजने के लिए इसका उपयोग करें, जैसे cp "$mydir/fileInTheSameFolder" /tmp(और कृपया हमेशा इसके चारों ओर दोहरे उद्धरणों का उपयोग करें, जैसा कि मैंने यहां किया था)।

ध्यान दें कि यह एक सापेक्ष पथ हो सकता है; उदाहरण के लिए, यदि स्क्रिप्ट को एक इंटरेक्टिव शेल से चलाया गया था, तो ./scriptname.commandयह बस "" के रूप में सामने आएगा। यह तब तक समस्या नहीं होनी चाहिए जब तक कि स्क्रिप्ट सीडी की कहीं और न हो, लेकिन यदि आपको पूर्ण पथ की आवश्यकता है तो आप इसके बजाय इसका उपयोग कर सकते हैं:

mydir="$(cd "$(dirname "$BASH_SOURCE")" && pwd)" || {
    echo "Error getting script directory" >&2
    exit 1
}

या, cdस्क्रिप्ट की शुरुआत में स्क्रिप्ट की निर्देशिका के लिए बस सकता है :

cd "$(dirname "$BASH_SOURCE")" || {
    echo "Error getting script directory" >&2
    exit 1
}

जब निर्देशिका नामों में स्थान होता है, तो पथ नहीं मिल सकता है।
स्टीवन वचोन

@StevenVachon जब तक आप पथ के सभी संदर्भों के बारे में डबल-कोट्स डालते हैं, तब तक यह काम करना चाहिए। यही है, ls "$mydir"और somecommand >>"$mydir/output.log"काम करेंगे, लेकिन ls $mydirऔर somecommand >>$mydir/output.logअसफल हो जायेगी। यह एक कारण है कि यह शेल स्क्रिप्ट्स में सभी चर संदर्भों को डबल-कोट (लगभग) करने के लिए एक अच्छा विचार है।
गॉर्डन डेविसन

$ BASH_SOURCE MacOS में खाली है, लेकिन लिनक्स में इसका मान है
LCB

@LCB क्या आपको यकीन है कि आप स्क्रिप्ट को बैश के तहत चला रहे हैं, कुछ अन्य शेल में नहीं?
गॉर्डन डेविसन

@GordonDavisson मुझे कारण मिला क्योंकि मैं उपयोग कर रहा हूं oh-my-zsh। और मुझे नहीं पता था कि #!/bin/bashअगर मैं फ़ाइल को चलाऊंगा तो लाइन को नजरअंदाज कर दिया जाएगा source ./script.sh
LCB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.