बैश स्क्रिप्ट लिखते समय, मुझे वर्तमान फ़ाइल के स्थान का पूर्ण पथ कैसे मिलता है?


16

मान लीजिए कि मेरे पास एक बैश फाइल है, जिसे कहा जाता है myBash.bash। इसमें रहता है:

/myDirect/myFolder/myBash.bash

अब मैं स्क्रिप्ट के अंदर स्ट्रिंग /myDirect/myFolder(स्थान का myBash.bash) का उपयोग करना चाहता हूं । क्या कोई कमांड है जो मैं इस स्थान को खोजने के लिए उपयोग कर सकता हूं?

संपादित करें: विचार यह है कि मैं एक ज़िप-फ़ोल्डर को कोड के साथ सेट करना चाहता हूं जिसे उस ज़िप-फ़ाइल के अंदर एक bash स्क्रिप्ट द्वारा शुरू किया जा सकता है। मैं उस ज़िप-फ़ाइल के अंदर कोड के सापेक्ष फ़ाइल-पथ जानता हूं, लेकिन निरपेक्ष पथ नहीं, और मुझे उनकी आवश्यकता है। एक रास्ता पथ में हार्ड-कोड के लिए होगा, या एक चर के रूप में फ़ाइल के पथ की आवश्यकता होगी। हालाँकि मुझे यह आसान लगेगा अगर यह bash-file के लिए यह पता लगाना संभव था कि यह अपने आप कहाँ है और फिर zip-file की संरचना के ज्ञान से अन्य फ़ाइल के लिए प्रासंगिक पथ बनाएं।


3
स्टैकओवरफ्लो के लिए यह बेहतर अनुकूल हो सकता है। इन प्रश्नों की जाँच करें: stackoverflow.com/questions/4774054/… stackoverflow.com/questions/59895/…
सेठोस II

1
कैसे उपयोग करें? कृपया स्पष्ट करें
सेर्गेई कोलोडियाज़नी

1
@ सेठोसि यह सवाल पूरी तरह से यहाँ विषय पर है
ज़ना

1
मैंने प्रश्न के संदर्भ को और अधिक जोड़ दिया। मैंने सोचा था कि निष्पादित होने वाली फ़ाइल का फ़ाइल-पथ प्राप्त करने के लिए एक आसान / स्पष्ट आदेश हो सकता है, लेकिन ऐसा लगता है कि उत्तर कम से कम गैर-स्पष्ट है।
डिंपल

3
@ मैं यह नहीं कहता कि यह अपमानजनक है, मुझे लगता है कि यह अधिक उचित है और जैसा कि पहले से ही पूछे गए और कई बार जवाब दिए गए लिंक के साथ दिखाया गया है।
सेठोस II

जवाबों:


24

आप पूरा रास्ता पा सकते हैं जैसे:

realpath "$0"

और जैसा कि सर्ग ने बताया है कि आप dirnameफाइलनाम को इस तरह से पट्टी करने के लिए उपयोग कर सकते हैं

dirname "$(realpath $0)"

या इससे भी बेहतर है कि मुश्किल फाइलनाम के साथ अजीब उद्धरण और शब्द-विभाजन को रोकने के लिए:

temp=$( realpath "$0"  ) && dirname "$temp"

मेरे पहले के विचार से बहुत बेहतर जो इसे पार्स करना था (मुझे पता था कि एक बेहतर तरीका होगा!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'

टिप्पणियाँ

  • realpath किसी फ़ाइल का वास्तविक पथ देता है
  • $0 क्या यह फ़ाइल (स्क्रिप्ट) है
  • s|old|new|के oldसाथ बदलेंnew
  • \(.*\)//बाद के लिए पहले किसी भी वर्ण को बचाएं
  • \1 बचा हुआ हिस्सा

2
$0और sedजादू के उपयोग के लिए +1 । लेकिन उक्त sedजादू वास्तव में अनावश्यक है जब उपकरण जैसे dirnameमौजूद हैं
सर्गी कोलोडाज़नी

2
आपके पास पहले से ही उत्तर है, उपयोग करें realpath: realpath "$( dirname $0 )"मैं व्यक्तिगत रूप से उपयोग करूंगा, readlinkलेकिन यह मेरे लिए है:readlink -e $(dirname $0)
सर्गिय कोलोडियाज़नी

@ शेर: dirname "$(realpath "$0")"बेहतर नहीं होगा ? आमतौर पर कोई भी उक्त फ़ाइल के संदर्भ में प्रतीकात्मक लिंक की मूल निर्देशिका के बजाय संदर्भित फ़ाइल की मूल निर्देशिका जानना चाहता है।
डेविड फ़ॉस्टर 01

4
@ शेर "$(dirname "$(realpath "$0")")"सबसे सीधा तरीका है। $()काम के अंदर उद्धरण सामान्य के रूप में।
डिप्रेस्डैनियल

@DepressedDaniel ने ऑनलाइन थोड़ा शोध किया, आप सही हैं: $()एक उप-समूह होने के नाते बाहर उद्धरण होने की अनुमति होगी। मैं यह बिल्कुल सीधा नहीं कहूंगा कि जब तक किसी को पता नहीं चलता $()कि सब ठीक-ठाक हैं
सेर्गेई कोलोडाझैनी

5

यदि स्क्रिप्ट आपके रास्ते में है तो आप कुछ का उपयोग कर सकते हैं

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

EDIT: सर्ग की टिप्पणियों को पढ़ने के बाद, यह एक सामान्य समाधान हो सकता है जो यह काम करता है कि स्क्रिप्ट आपके मार्ग में है या नहीं।

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"

whichजब स्क्रिप्ट उन निर्देशिकाओं में से एक में रहती है जो PATHचर का हिस्सा हैं, तो अधिक उपयुक्त है । $0एक स्क्रिप्ट के भीतर से उपयोग करें , जैसे ज़न्ना शो। लेकिन आपका जवाब उचित है क्योंकि आप के dirnameसाथ खिलवाड़ करने के बजाय उपयोग करते हैं sed, इसलिए उसके लिए +1
सेर्गेई कोलोडियाज़नी

5

स्वीकृत उत्तर एकदम सही लगता है। यहाँ यह करने का एक और तरीका है:

cd "$(dirname "$0")"
/bin/pwd

/bin/pwdpwdबिल्ट कमांड के विपरीत, डायरेक्टरी के वास्तविक पथ को प्रिंट करता है ।


0
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

इसे केनोरब और एंड्रो से संदर्भ के रूप में लिया गया है
कोई डिरनेम, रीडलिंक, रियलपाथ, BASH_SOURCE
सभी बिल्ट हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.