निम्नलिखित सरल वन-लाइनर्स आज़माएं:
सभी UNIX / OSX / Linux के लिए
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
दे घुमा के
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
नोट: कमांड विकल्पों के अंत को दर्शाने के लिए कमांड में एक डबल डैश (-) का उपयोग किया जाता है, इसलिए डैश या अन्य विशेष वर्ण वाली फाइलें कमांड को नहीं तोड़ेंगी।
नोट: बैश में, के ${BASH_SOURCE[0]}पक्ष में उपयोग करें $0, अन्यथा इसे सोर्स करते समय रास्ता टूट सकता है ( source/ .)।
लिनक्स, मैक और अन्य के लिए * बीएसडी:
cd "$(dirname "$(realpath "$0")")";
नोट: realpathडिफ़ॉल्ट रूप से (उबंटू की तरह) सबसे लोकप्रिय लिनक्स वितरण में स्थापित किया जाना चाहिए, लेकिन कुछ में यह गायब हो सकता है, इसलिए आपको इसे स्थापित करना होगा।
नोट: यदि आप बैश का उपयोग कर रहे हैं, तो ${BASH_SOURCE[0]}इसके पक्ष में उपयोग करें $0, अन्यथा सोर्सिंग ( source/ .) के दौरान रास्ता टूट सकता है ।
अन्यथा आप ऐसा कुछ आज़मा सकते हैं (यह पहले मौजूदा उपकरण का उपयोग करेगा):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
लिनक्स के लिए विशिष्ट:
cd "$(dirname "$(readlink -f "$0")")"
* BSD / Mac पर GNU रीडलिंक का उपयोग:
cd "$(dirname "$(greadlink -f "$0")")"
नोट: आपको coreutilsस्थापित करना होगा (उदाहरण के लिए 1. होमब्रे , 2. स्थापित करें brew install coreutils)।
मारपीट में
बैश में, आप इसे प्राप्त करने के लिए पैरामीटर विस्तार का उपयोग कर सकते हैं , जैसे:
cd "${0%/*}"
लेकिन यह काम नहीं करता है यदि स्क्रिप्ट उसी निर्देशिका से चलाई जाती है।
वैकल्पिक रूप से आप निम्नलिखित फ़ंक्शन को bash में परिभाषित कर सकते हैं:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
यह फ़ंक्शन 1 तर्क लेता है। यदि तर्क में पहले से ही पूर्ण पथ है, तो इसे प्रिंट करें जैसा कि यह है, अन्यथा $PWDचर + फ़ाइल नाम तर्क ( ./उपसर्ग के बिना ) प्रिंट करें ।
या यहाँ डेबियन .bashrcफ़ाइल से लिया गया संस्करण है :
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
सम्बंधित:
यह सभी देखें:
मैं एक मैक पर जीएनयू के रीडलिंक का व्यवहार कैसे प्राप्त कर सकता हूं?