sh

2008-10-16 16 views
13

में% ~ dp0 के समतुल्य मैं कुछ विंडोज बैच फ़ाइलों को शिक्स का उपयोग करके यूनिक्स स्क्रिप्ट में परिवर्तित कर रहा हूं। मुझे समस्या है क्योंकि कुछ व्यवहार बैच फ़ाइलों में उपलब्ध% ~ dp0 मैक्रो पर निर्भर है।sh

क्या कोई इसके बराबर समतुल्य है? निर्देशिका प्राप्त करने का कोई तरीका जहां निष्पादन स्क्रिप्ट रहता है?

+0

ऐसा लगता है जब पार्टी को डिजाइन इस सुविधा के लिए ... – n611x007

उत्तर

1

हाँ, आप कर सकते हैं! यह तर्क में है। :)

${0} 

पर

नज़र संयोजन है कि क्या आप चाहते हैं

{$var%Pattern} 
Remove from $var the shortest part of $Pattern that matches the back end of $var. 

के साथ सिर्फ

${0%/*} 

है मैं Advanced Bash Scripting Guide (कि भी है जहां उपरोक्त जानकारी की सिफारिश से है)। Converting DOS Batch Files to Shell Scripts पर भाग Es Esciciall आपके लिए उपयोगी हो सकता है। :)

यदि मैंने आपको गलत समझा है, तो आपको इसे "pwd" के आउटपुट के साथ जोड़ना पड़ सकता है। चूंकि इसमें केवल उस पथ को शामिल किया गया है जिसमें स्क्रिप्ट को बुलाया गया था! निम्न स्क्रिप्ट का प्रयास करें:

#!/bin/bash 
called_path=${0%/*} 
stripped=${called_path#[^/]*} 
real_path=`pwd`$stripped 
echo "called path: $called_path" 
echo "stripped: $stripped" 
echo "pwd: `pwd`" 
echo "real path: $real_path 

हालांकि कुछ काम की आवश्यकता है। मैं डेव वेबब के दृष्टिकोण का उपयोग करने की सलाह देता हूं जब तक यह असंभव न हो।

-1

इस प्रयास करें:

${0%/*} 
0

मैं $ 0 से पहले, अर्थात् की कोशिश की है: "।"

dirname $ 0

और यह सिर्फ रिटर्न यहां तक ​​कि जब स्क्रिप्ट को दूसरी स्क्रिप्ट द्वारा सोर्स किया जा रहा है:

$0 साथ (आप के लिए) ../somedir/somescript.sh

+0

जाने के लिए एक चिंता का विषय है आप सटीक स्क्रिप्ट आप की कोशिश की पोस्ट कर सकते हैं नहीं था? या उदाहरण – Sarien

6

समस्या यह जो कुछ कमांड लाइन के लिए सेट है कि स्क्रिप्ट, नहीं स्क्रिप्ट ही के स्थान आह्वान करने के लिए उपयोग किया गया है। इससे विंडोज बैच फ़ाइल में %~dp0 से प्राप्त स्क्रिप्ट युक्त निर्देशिका का पूरा पथ प्राप्त करना मुश्किल हो सकता है।निम्न स्क्रिप्ट

उदाहरण के लिए, पर विचार करें, dollar.sh:

# ./dollar.sh 
./dollar.sh 
# /tmp/dollar.sh 
/tmp/dollar.sh 

तो पूरी तरह से योग्य निर्देशिका का नाम पाने के लिए:

#!/bin/bash 
echo $0 

आप इसे चलाने चाहते हैं, तो आप निम्न उत्पादन मिल जाएगा एक स्क्रिप्ट का मैं निम्नलिखित करता हूं:

cd `dirname $0` 
SCRIPTDIR=`pwd` 
cd - 

यह निम्नानुसार कार्य करता है:

  1. cd स्क्रिप्ट की निर्देशिका में या तो कमांड लाइन से रिश्तेदार या पूर्ण पथ का उपयोग करके।
  2. इस निर्देशिका का पूर्ण पथ प्राप्त करता है और इसे SCRIPTDIR पर संग्रहीत करता है।
  3. "cd -" का उपयोग कर पिछली कार्य निर्देशिका में वापस जाता है।
+1

यदि कार्यशील निर्देशिका को बदलना अवांछनीय है तो मैंने एक और ऐप्राच जोड़ा। – Sarien

+2

स्क्रिप्ट पथ में है और सीधे नहीं कहा जा रहा है, तो $ 0 केवल स्क्रिप्ट का नाम होगा और यह विधि काम नहीं करेगी। –

+0

तो 'किस' को भी कॉल में फेंक दें, और समस्या हल हो गई है। (जो आपको कमांड का पूरा पथ बताता है, लेकिन अधिकांश लोगों को यह नहीं पता कि यह पूर्ण पथ वापस आ गया है यदि यह पहले से ही पूर्ण है।) – Trejkaz

2

मैं एक स्क्रिप्ट के लिए पथ खोजने का प्रयास कर रहा था जिसे किसी अन्य स्क्रिप्ट से भेजा जा रहा था। और यह मेरी समस्या थी, जब पाठ को सोर्सिंग केवल कॉलिंग स्क्रिप्ट में कॉपी हो जाती है, तो $ 0 हमेशा कॉलिंग स्क्रिप्ट के बारे में जानकारी देता है।

मुझे एक वर्कअराउंड मिला, जो केवल बैश में काम करता है, $ BASH_SOURCE में हमेशा उस स्क्रिप्ट के बारे में जानकारी होती है जिसमें इसे संदर्भित किया जाता है। यहां तक ​​कि अगर स्क्रिप्ट को सोर्स किया जाता है तो यह मूल (सोर्स) स्क्रिप्ट के लिए सही ढंग से हल किया जाता है।

2

linux के अंतर्गत bash में आप के साथ आदेश का पूर्ण पथ प्राप्त कर सकते हैं:

readlink /proc/$$/fd/255 

और निर्देशिका पाने के लिए:

dir=$(dirname $(readlink /proc/$$/fd/255)) 

यह बदसूरत है, लेकिन मैं अभी तक एक और रास्ता खोजने के लिए है ।

+0

क्या आप स्पष्टीकरण का विस्तार कर सकते हैं कि यह अन्य प्रस्तावित उत्तरों से बेहतर क्यों है इस मामले में जब स्क्रिप्ट पथ में है और इस प्रकार अप्रत्यक्ष रूप से कहा जाता है, और यह कैसे काम करता है, यह किस पर निर्भर करता है (मुझे बैश के '$$ 'जैसी चीजों की उम्मीद है, और एक यूनिक्स फ़ाइल-सिस्टम, कृपया ध्यान दें कि बैश है साइगविन या मिंगव पर जिसे पॉज़िक्स-संगत फाइल सिस्टम संरचना के बिना हाथ में शुरू किया जा सकता है)? – n611x007

0

यह bash खोल के लिए काम करना चाहिए:

dir=$(dirname $(readlink -m $BASH_SOURCE)) 

टेस्ट स्क्रिप्ट:

#!/bin/bash 
echo $(dirname $(readlink -m $BASH_SOURCE)) 

परीक्षण चलाएं:

$ ./somedir/test.sh 
/tmp/somedir 
$ source ./somedir/test.sh 
/tmp/somedir 
$ bash ./somedir/test.sh 
/tmp/somedir 
$ . ./somedir/test.sh 
/tmp/somedir 
1

सही जवाब यह एक है: How do I determine the location of my script? I want to read some config files from the same place.

यह जानना महत्वपूर्ण है कि सामान्य मामले में, इस समस्या का कोई समाधान नहीं है। आपके द्वारा किसी भी दृष्टिकोण के बारे में सुना होगा, और नीचे दिए गए किसी भी दृष्टिकोण में त्रुटियां हैं और केवल विशिष्ट मामलों में ही काम करेंगे। सबसे पहले और सबसे महत्वपूर्ण, अपनी स्क्रिप्ट के स्थान के आधार पर पूरी तरह से समस्या से बचने का प्रयास करें!

समाधानों में गोता लगाने से पहले, चलो कुछ गलतफहमी को स्पष्ट करते हैं। यह समझना महत्वपूर्ण है कि: आपकी स्क्रिप्ट में वास्तव में कोई स्थान नहीं है!जहां भी बाइट्स आते हैं, इसके लिए कोई "एक कैननिकल पथ" नहीं है। कभी नहीं। $ 0 आपकी समस्या का उत्तर नहीं है। यदि आपको लगता है कि, आप या तो पढ़ना बंद कर सकते हैं और अधिक बग लिख सकते हैं, या आप इसे स्वीकार कर सकते हैं और पढ़ सकते हैं। ...

संबंधित मुद्दे