निम्नलिखित सरल वन-लाइनर्स आज़माएं:
सभी 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"
}
सम्बंधित:
यह सभी देखें:
मैं एक मैक पर जीएनयू के रीडलिंक का व्यवहार कैसे प्राप्त कर सकता हूं?