2009-03-10 12 views
79

संभव डुप्लिकेट:
Can a Bash script tell what directory it's stored in?को क्रियान्वित करने bash स्क्रिप्ट के मार्ग का निर्धारण

एक Windows कमांड स्क्रिप्ट में, एक वर्तमान में क्रियान्वित स्क्रिप्ट %~dp0 का उपयोग करने का निर्देशिका पथ निर्धारित कर सकते हैं । उदाहरण के लिए:

@echo Running from %~dp0 

BASH स्क्रिप्ट में समतुल्य क्या होगा?

+1

इस डुप्लिकेट है, तो मूल से लिंक करें। – fpt

उत्तर

123

सापेक्ष पथ (विंडोज '%~dp0 के प्रत्यक्ष बराबर यानी) के लिए:

MY_PATH="`dirname \"$0\"`" 
echo "$MY_PATH" 

निरपेक्ष, सामान्यीकृत पथ के लिए:

MY_PATH="`dirname \"$0\"`"    # relative 
MY_PATH="`(cd \"$MY_PATH\" && pwd)`" # absolutized and normalized 
if [ -z "$MY_PATH" ] ; then 
    # error; for some reason, the path is not accessible 
    # to the script (e.g. permissions re-evaled after suid) 
    exit 1 # fail 
fi 
echo "$MY_PATH" 
+0

मेरे मैक बैश पर काम नहीं करता है। –

+0

आपके मैक बैश पर समस्या क्या है? सिगविन, लिनक्स, सोलारिस इत्यादि पर बस ठीक काम करता है, और इसे मैक – vladr

+0

पर भी काम करना चाहिए, यह केवल –

16

आप बैश का पूर्ण पथ में टाइप मान लिया जाये

#!/bin/bash 
echo "$0" 
dirname "$0" 

पूर्व: स्क्रिप्ट, $0 और dirname, जैसे का उपयोग पर्याप्त उत्पादन:

$ /a/b/c/myScript.bash 
/a/b/c/myScript.bash 
/a/b/c 

यदि आवश्यक हो, एक रिश्तेदार पथ के लिए $PWD चर के परिणामों जोड़ देते हैं।

संपादित करें: जोड़ा गया उद्धरण चिह्नों अंतरिक्ष पात्रों को संभालने के लिए।

+0

@ रोथको, यदि आपका $ रिक्त स्थान है तो आपका समाधान विफल हो जाएगा। – vladr

+1

बैश के भीतर आप '$ BASH_SOURCE' का भी उपयोग कर सकते हैं। से [इस पोस्ट] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in)। मैक ओएसएक्स पर – JamesThomasMoon1979

7

द्वारा योगदान स्टीफन चेज़ला c.us.s. पर मान लिया जाये कि POSIX खोल:

prg=$0 
if [ ! -e "$prg" ]; then 
    case $prg in 
    (*/*) exit 1;; 
    (*) prg=$(command -v -- "$prg") || exit;; 
    esac 
fi 
dir=$(
    cd -P -- "$(dirname -- "$prg")" && pwd -P 
) || exit 
prg=$dir/$(basename -- "$prg") || exit 

printf '%s\n' "$prg" 
+0

मेरे लिए शानदार काम इस प्रश्न में अन्य दृष्टिकोण नहीं थे। '$ PATH' खोज के माध्यम से स्क्रिप्ट आमंत्रण से निपटने के लिए – ams

+0

+1; हालांकि, उपर्युक्त ** POSIX ** नहीं है। यह केवल 'बाश' के साथ काम करेगा। 'कमांड' के बजाय 'कौन सा 'और' $ (...) 'के बजाय बैकटिक्स का उपयोग करें, इसे अन्य, पुराने गोले के नीचे चलाना है। – vladr

+6

हाय @vladr, उपरोक्त कोड POSIX है! अगर मैं सही ढंग से समझता हूं, तो आपका मतलब यह है कि कोड पुराने बोर्न शेल (/ उदाहरण के लिए सोलारिस <11 पर बिन/श) के साथ नहीं चलेगा, लेकिन इसका POSIX से कोई लेना देना नहीं है। –

1

Vlad के कोड overquoted है। होना चाहिए:

MY_PATH=`dirname "$0"` 
MY_PATH=`(cd "$MY_PATH" && pwd)` 
+0

आपकी दूसरी लाइन में एक अतिरिक्त डबल-कोट चरित्र है। –

3
echo Running from `dirname $0` 
+2

'$ 0' से बच जाना चाहिए (' dirname "$ 0" ') – fnkr

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