dirname
आदेश सबसे बुनियादी, बस के बंद फ़ाइल नाम करने के लिए पथ को पार्स है $0
(स्क्रिप्ट नाम) अलग-अलग:
dirname "$0"
लेकिन, जैसा कि मैट बी ने बताया है कि स्क्रिप्ट को कैसे कहा जाता है, इसके आधार पर लौटाया गया रास्ता अलग है। pwd
काम नहीं करता है क्योंकि यह केवल आपको बताता है कि वर्तमान निर्देशिका क्या है, यह नहीं है कि स्क्रिप्ट किस निर्देशिका में रहती है। इसके अलावा, यदि किसी स्क्रिप्ट के प्रतीकात्मक लिंक को निष्पादित किया जाता है, तो आपको एक (शायद रिश्तेदार) पथ मिलने वाला है। जहां लिंक रहता है, वास्तविक स्क्रिप्ट नहीं।
कुछ अन्य लोगों ने readlink
कमांड का उल्लेख किया है , लेकिन इसके सबसे सरल पर, आप इसका उपयोग कर सकते हैं:
dirname "$(readlink -f "$0")"
readlink
फाइलसिस्टम की जड़ से स्क्रिप्ट पथ को एक पूर्ण पथ पर हल करेगा। तो, एकल या डबल डॉट्स, टिल्ड और / या प्रतीकात्मक लिंक वाले किसी भी पथ को पूर्ण पथ पर हल किया जाएगा।
इनमें से प्रत्येक को प्रदर्शित करने वाली एक स्क्रिप्ट है whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
इस स्क्रिप्ट को मेरे घर में चलाना, रिश्तेदार पथ का उपयोग करना:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
फिर, लेकिन स्क्रिप्ट के लिए पूर्ण पथ का उपयोग कर:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
अब बदलती निर्देशिका:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
और अंत में स्क्रिप्ट को निष्पादित करने के लिए एक प्रतीकात्मक लिंक का उपयोग करना:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- और इसे बिना कमांड प्रतिस्थापन के हटा सकते हैं -DIR="${DIR%x}"
।