2012-03-28 13 views
40

शीर्षक यह सब कहना चाहिए। मैं zsh में ${BASH_SOURCE[0]} के बराबर की तलाश में हूं।

नोट: मैं खोजने "$0${BASH_SOURCE[0]} के बराबर है" इंटरनेट के आसपास रखने के लिए, लेकिन यह गलत हो रहा है: $0 क्रियान्वित आदेश के नाम पर हो रहा है। (यह argv[0] है, जो समझ में आता है।) मेरी स्क्रिप्ट में $ 0 प्रतिबिंबित करना (.zshrc) $0 के लिए देता है, जो ${BASH_SOURCE[0]} जैसा नहीं है। वास्तव में, ${BASH_SOURCE[0]} में काम करता है, .zshrc फ़ाइलों के अंदर छोड़कर।

क्या मैं वास्तव में मेरे .zshrc में कर रहा हूँ (जो काम नहीं कर रहा):

echo ${BASH_SOURCE[0]} 
source `dirname $0`/common-shell-rc.sh 

स्रोत में विफल रहता है ($0zsh है) और echo एक रिक्त पंक्ति आउटपुट।

संपादित करें: जाहिरा तौर पर, $0 काम करने के लिए, मैं विकल्प FUNCTION_ARGZERO विकल्प सेट की जरूरत है। यह जांचने का कोई तरीका है कि यह एक स्क्रिप्ट में सेट है या नहीं? (ताकि मैं इसे अस्थायी रूप से सेट कर सकूं) यह स्पष्ट रूप से तब तक है जब तक आप nofunction_argzero सेट नहीं करते हैं, और यह मेरे खोल में है। अभी भी $0 के लिए कुछ भी नहीं मिला। (मुझे लगता है कि बी/सी मैं एक समारोह में नहीं हूं।)

उत्तर

12

$0 सही है। एक सोर्स लिपि में, यह एक स्क्रिप्ट का नाम है, क्योंकि इसे . या source में अंतर्निहित किया गया था (इसलिए यदि path_dirs विकल्प सेट है, तो आपको स्क्रिप्ट के वास्तविक स्थान को खोजने के लिए $path लुकअप करने की आवश्यकता हो सकती है)।

.zshrc सोर्स नहीं किया गया है, जो बताता है कि $0.zshrc पर क्यों सेट नहीं है। आप फ़ाइल नाम और स्थान को वैसे भी जानते हैं: यह ${ZDOTDIR-~}/.zshrc है।

+0

मुझे अभी भी यकीन नहीं है कि यह सही है। इन दो फाइलें बनाएं: 'foo' जिसमें' स्रोत।/Foo2' और 'foo2'' echo $ 0' है। अब '।/Foo' चलाएं, और आपको'।/Foo' का आउटपुट मिलेगा, जो कि सोर्स की गई स्क्रिप्ट का नाम नहीं है। '$ {' को' $ {BASH_SOURCE [0]} 'के साथ बदलें, बैश के साथ फिर से चलाएं, और आपको '।/Foo2' मिल जाएगा। – Thanatos

+0

@ तानाटोस मुझे '/ foo2' (zsh 4.3.10 मिलता है; यह किसी बिंदु पर बदल सकता है, लेकिन 4.0 के बाद से नहीं)। आपके निर्देशों की तुलना में, मैंने zsh के अंतर्गत स्क्रिप्ट चलाने के लिए 'foo' के शीर्ष पर' #!/Bin/zsh' जोड़ा। क्या आप वाकई zsh के तहत 'foo' चला रहे हैं? – Gilles

+2

बस स्पष्टीकरण और जोर देने के लिए ... ** 'zsh' ** (और संभवतः अन्य गोले) में,' $ 0' का मान सोर्स स्क्रिप्ट है जो कॉलर स्क्रिप्ट नहीं है। यह नहीं है कि यह बैश में कैसे काम करता है। तो zsh में '$ 0' बैश में' $ {BASH_SOURCE [0]} 'जैसा ही है। – toxalot

2

शायद आप $_ देख रहे हैं?

# foo.sh 
source foo2.sh 

और

# foo2.sh 
echo $_ 

पैदावार

# ./foo.sh 
foo2.sh 
+0

सर्वोत्तम परिणाम के लिए: '$ {BASH_SOURCE: - $ _}' – mpapis

+1

यह बताए जाने का सबसे अच्छा अभ्यास है * क्यों * एक उत्तर जो आप काम प्रदान करते हैं, या, ऐसे मामलों में जहां उत्तर है, उसमें मूलभूत व्याख्या शामिल है सुविधा। (नरक, यहां तक ​​कि मैनपेज के एक छोटे से हिस्से को प्रतिलिपि बनाना कभी भी बुरा विचार नहीं है!) – ELLIOTTCABLE

+0

$ _ उस मामले के लिए बैश में काम नहीं करता है जहां script1.sh स्रोत script2.sh जो $ echo echo करता है। यह script1.sh, i.e. $ 0 (मुख्य स्क्रिप्ट) लौटाएगा, जबकि $ {BASH_SOURCE [0]} script2.sh (सबस्क्राइब जो echo $ _ को कॉल कर रहा है) लौटाएगा। तो $ _ मूल रूप से $ 0 AFAICS की तरह है। –

33

${BASH_SOURCE[0]} zsh में बराबर ${(%):-%N}, नहीं $0 है (के रूप में ओ पी ने कहा, बाद .zshrc में विफल)

यहाँ % मूल्य पर त्वरित विस्तार इंगित करता है, %N इंगित करता है "स्क्रिप्ट के नाम, sourced फ़ाइल, या खोल समारोह है कि zsh वर्तमान में क्रियान्वित किया जाता है,

जो भी सबसे हाल ही में शुरू किया गया था। यदि कोई नहीं है, तो यह पैरामीटर $ 0 के बराबर है। "(man zshmisc से)

+4

ग्रेट - यह ओपी के लिए काम करना चाहिए, लेकिन ध्यान दें कि सही '$ BASH_SOURCE' बराबर'% x' है, न कि '% एन', क्योंकि यह _functions_ के अंदर बुलाए जाने पर भी _file_ को संलग्न करता है - दूसरे शब्दों में: '$ {(%) का उपयोग करें: -% x}' – mklement0

+0

अरे, प्रलेखन पढ़ना, मुझे समझ में नहीं आता कि हमें यहां ': -' क्यों चाहिए, और क्यों '$ {(%)% N}' willn' टी एक ही काम नहीं करता (नोट: मुझे पता है कि यह काम नहीं करता है) – PierreBdR

+0

क्या कोई दस्तावेज है जो अन्य विकल्प अलग-अलग विकल्प हैं -% एन उपलब्ध हैं? – Martin

8

यदि आप सिमलिंक कर रहे हैं।एक dotfiles निर्देशिका में zshrc और निर्देशिका में अन्य फ़ाइलों का संदर्भ लेना चाहते हैं, तो इस कोशिश:

SOURCE=${(%):-%N} 
while [ -h "$SOURCE" ]; do 
    DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 
    SOURCE="$(readlink "$SOURCE")" 
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" 
done 
DOTFILES_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 

(मैं here से पाश स्क्रिप्ट मिला है।)

+0

क्या कोई दस्तावेज है जो अन्य विकल्प अलग-अलग रूप है - % एन उपलब्ध हैं? – Martin

+0

[zsh दस्तावेज़ों को आजमाएं] (http://zsh.sourceforge.net/Doc/Release/Prompt- एक्सटेंशन।एचटीएमएल) –

10

${(%):-%x}bash के सबसे करीब zsh बराबर है $BASH_SOURCE (और ksh का ${.sh.file}) - $0 नहीं है।

his answer में महत्वपूर्ण सूचक और पृष्ठभूमि जानकारी प्रदान करने के लिए हुई झेंग की टोपी की युक्ति।

यह (संभावित सापेक्ष) संलग्न स्क्रिप्ट की राह देता है,

  • स्क्रिप्ट किया जा रहा है, चाहे या नहीं sourced।
    • विशेष रूप से, यह भी प्रारंभ/प्रोफाइल के अंदर काम करता है इस तरह के रूप ~/.zshrc ($0, जो बेवजह खोल के पथ वहाँ रिटर्न के विपरीत) फ़ाइलें।
  • है कि क्या एक समारोह स्क्रिप्ट या नहीं में परिभाषित अंदर से कहा जाता है की परवाह किए बिना ($0 है, जो एक समारोह के अंदर समारोह नाम देता है के विपरीत)।

मैंने पाया $BASH_SOURCE को फर्क सिर्फ इतना है निम्नलिखित अस्पष्ट स्थिति में है - जो भी एक बग (zsh 5.0.5 में मनाया) हो सकता है: एक समारोह एक में एक और समारोह अंदर नेस्टेड अंदर कि नेस्टेड समारोह (फिर) बाद में, के बाद (रिटर्न या तो कुछ भी नहीं है या 'zsh') sourced किया गया है कहा जाता है जब sourced स्क्रिप्ट, ${(%):-%x}नहीं वापसी संलग्न स्क्रिप्ट पथ करता है।


पृष्ठभूमि जानकारी पर ${(%):-%x}:

  • एक पैरामीटर में एक चर नाम के एवज में (%):- (चर) विस्तार (${...}) बनाता उपलब्ध दृश्यों कि सामान्य रूप से प्रतिनिधित्व करने के लिए उपयोग किया जाता है से बचने में पर्यावरण की जानकारी तार, जैसे PS1 चर में उपयोग की गई स्ट्रिंग डिस्प्ले को निर्धारित करने के लिए प्राथमिक इंटरैक्टिव प्रॉम्प्ट के रूप में डी।

    • % एक पैरामीटर विस्तार झंडा, जो सभी के शीर्षक Parameter Expansion Flags तहत man zshexpn में सूचीबद्ध हैं का एक उदाहरण है।
  • %x तत्काल तारों में उपयोग किए जा सकने वाले भागने वाले दृश्यों में से एक है, और यह ऊपर वर्णित कार्य करता है; वर्तमान डीआईआर का प्रतिनिधित्व करने के लिए %d जैसे कई और हैं।

    • man zshmisc शीर्षक SIMPLE PROMPT ESCAPES शीर्षक के तहत सभी उपलब्ध अनुक्रमों को सूचीबद्ध करता है।
+0

क्या कोई दस्तावेज है जो अन्य विकल्प अलग-अलग विकल्प हैं -% x उपलब्ध हैं? – Martin