2015-05-12 6 views
10

को एक साथ जोड़ें यह एक शेल स्क्रिप्ट (.sh फ़ाइल) है। मुझे वर्तमान निर्देशिका के आधार पर एक पूर्ण पथ बनाना होगा। मुझे pwd के बारे में पता है, लेकिन मैं इसे किसी अन्य स्ट्रिंग के साथ कैसे जोड़ूं?वर्तमान निर्देशिका प्राप्त करें और पथ

"$pwd/some/path" 
+1

आपका खोल क्या है? कुछ गोले '$ PWD' चर बनाए रखते हैं, इसलिए आपको' pwd' –

उत्तर

17

आप की तरह चाहते आवाज:: यहाँ मैं क्या कर कोशिश कर रहा हूँ का एक उदाहरण है

path="$(pwd)/some/path" 

$( एक subshell खोलता है (और ) यह बंद कर देता है) जहां सामग्री हैं एक स्क्रिप्ट के रूप में निष्पादित किया गया है ताकि स्ट्रिंग में उस स्थान पर कोई भी आउटपुट लगाया जा सके।


अधिक उपयोगी अक्सर कि चल रहा है स्क्रिप्ट की निर्देशिका हो रही है:

dot="$(cd "$(dirname "$0")"; pwd)" 
path="$dot/some/path" 

ऐसा इसलिए है क्योंकि यह एक ही पथ पर ले कर कोई बात नहीं तुम कहाँ हो और अधिक उपयोगी है जब आप स्क्रिप्ट चलाने:

> pwd 
~ 
> ./my_project/my_script.sh 
~/my_project/some/path 

बजाय:

> pwd 
~ 
> ./my_project/my_script.sh 
~/some/path 
> cd my_project 
> pwd 
~/my_project 
> ./my_script.sh 
~/my_project/some/path 

अधिक जटिल है, लेकिन आप अगर यह एक सिमलिंक के माध्यम से निष्पादित किया गया है (आम जब उदाहरण के लिए homebrew के माध्यम से स्क्रिप्ट इंस्टॉल) चल रहा वर्तमान स्क्रिप्ट निर्देशिका की जरूरत है तो आप को पार्स और सिमलिंक पालन करने की आवश्यकता:

if [[ "$OSTYPE" == *darwin* ]]; then 
    READLINK_CMD='greadlink' 
else 
    READLINK_CMD='readlink' 
fi 

dot="$(cd "$(dirname "$([ -L "$0" ] && $READLINK_CMD -f "$0" || echo "$0")")"; pwd)" 

काम करने के लिए इसके लिए अधिक जटिल और अधिक आवश्यकताएं (उदाहरण के लिए एक gnu संगत रीडलिंक स्थापित है) तो मैं इसे उतना उपयोग नहीं करता है। केवल जब मुझे यकीन है कि मुझे इसकी आवश्यकता है, जैसे होमब्री के माध्यम से एक कमांड स्थापित करना।

+0

पर कॉल करने की आवश्यकता नहीं है जबकि '$ (pwd)' काम करता है, यह '$ PWD' का उपयोग करने के लिए सरल (और मामूली रूप से अधिक कुशल) है, जो कि एक है POSIX- अनिवार्य खोल चर। अच्छी टिप फिर से _running scriptss_ निर्देशिका का निर्धारण कर रही है, लेकिन ध्यान दें कि यदि स्क्रिप्ट को _symlink_ के माध्यम से बुलाया गया था तो यह अपेक्षित काम नहीं कर सकता है। दुर्भाग्य से, कोई सीधा समाधान नहीं है जो पोर्टेबल भी है। – mklement0

+1

सच सच है, सिम्लिंक इसे और अधिक जटिल बना सकता है, मैं इसे दिखाने के लिए इसे अपडेट कर दूंगा। –

+0

अद्यतन करने के लिए धन्यवाद। चूंकि 'readlink -f' पूर्ण लक्ष्य पथ की रिपोर्ट करता है, भले ही तर्क _not_ एक symlink है, आप 'dot = $ (dirname -" $ (READLINK_CMD -f - "$ 0") "को सरल बना सकते हैं"। ध्यान दें कि '$ OSTYPE' का उपयोग पोर्टेबल नहीं है (' bash' और 'zsh' हालांकि यह है)। मैंने एक पॉज़िक्स-अनुरूप शेल फ़ंक्शन बनाया है [यहां] (http://stackoverflow.com/a/29835459/45375)। – mklement0

3

खोल builtin एक कमांड प्रतिस्थापन में pwd ($(...)) का उपयोग करना आवश्यक है, क्योंकि सभी POSIX संगत गोले विशेष $PWD खोल ऐसा वैरिएबल निरपेक्ष पथ के रूप में वर्तमान निर्देशिका में शामिल है परिभाषित करते हैं, एक विकल्प है, लेकिन mandated by POSIX के रूप में नहीं ।

इस प्रकार, का उपयोग कर $PWD दोनों सरल और से $(pwd) अधिक कुशल है:

"$PWD/some/path" # alternatively, for visual clarity: "${PWD}/some/path" 

हालांकि, अगर आप निर्देशिका पथ में सिमलिंक को हल करना चाहता था, आप pwd की जरूरत है, के साथ अपने -P विकल्प:

"$(pwd -P)/some/path" 

ध्यान दें कि POSIX mandates that $PWD contain an absolute pathname with symlinks resolved। प्रैक्टिस में, हालांकि, कोई प्रमुख पॉज़िक्स-जैसे खोल (bash, dash, ksh, zsh) ऐसा करता है - वे सभी प्रतीकात्मक लिंक घटक बनाए रखते हैं। इस प्रकार, pwd -P उन्हें हल करने के लिए आवश्यक है।


Michael Allen's helpful answer अंक बाहर है कि यह आम है जहां चालू स्क्रिप्ट स्थित है निर्देशिका में जानना चाहते हैं।

चुनौती स्क्रिप्ट फ़ाइल ही एक सिमलिंक, तो मूल के सच निर्देशिका का निर्धारण हो सकता है गैर तुच्छ, पोर्टेबिलिटी बहुत जरूरी है, खासकर जब है।
This answer (मेरा) एक समाधान दिखाता है।

0

"dirname $0" के साथ आप वर्तमान रन विज्ञान तक डायनेमिन पथ प्राप्त कर सकते हैं। उदाहरण के लिए : आपकी फ़ाइल को खोल फ़ोल्डर फ़ाइल नाम में locateted xyz है और xyz फ़ाइल में शामिल करने के लिए एंथोर फ़ाइल abc हैं। तो xyz फ़ाइल में डाल दें LIK:

 php "`dirname $0`"/abc.php 
संबंधित मुद्दे