मैं मैक ओएस एक्स पर शेल स्क्रिप्ट में निरपेक्ष फ़ाइल नाम कैसे प्राप्त कर सकता हूं?


19

मैं उस स्क्रिप्ट फ़ाइल के पूर्ण फ़ाइल नाम को पुनः प्राप्त करना चाहता हूं जिसे वर्तमान में निष्पादित किया गया है। लिंक को भी हल किया जाना चाहिए।

लिनक्स पर, यह इस तरह से किया जा रहा है:

$(readlink -mn "$0")

लेकिन मैक ओएस एक्स पर बहुत अलग तरीके readlinkसे काम करता है।

मैंने पढ़ा है कि यह प्रयोग किया जाता है

$(realpath $0)

बीएसडी में, लेकिन वह भी काम नहीं करता है। मैक ओएस एक्स में नहीं है realpath

कोई उपाय?




इससे भी अधिक विकल्प: stackoverflow.com/questions/7665/…
गेरहार्ड बर्गर

जवाबों:


19

मैं धोखा देता हूं और इस बात के लिए पर्ल का उपयोग करता हूं:

#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname

आपको लगता है कि मैं पूरी स्क्रिप्ट को पर्ल में लिखूंगा, और अक्सर मैं करता हूं, लेकिन हमेशा नहीं।


यह काम करता है, बहुत बहुत धन्यवाद। मैं जितनी जल्दी हो सके, आपको उत्थान दूंगा। किसी को भी यह करने का एक "शुद्ध खोल" तरीका है?
हक्सी

1
मुझे डर है कि यह जितना अच्छा हो उतना अच्छा है। (कई बहु-पंक्ति "शुद्ध खोल" को हैक करके कोई भी Google पर खोज सकता है।)
अर्जन

एक और संभावना (हालांकि बदसूरत) '..' पथ को याद करने के लिए है, (तब तक पुनरावृत्ति या एक सरणी) याद रखना '..' आपके पास अभी भी वही फ़ाइल देता है (यानी: आप शीर्ष पर हैं), फिर वापस कोडांतरण पर आते हैं आपके जाते ही रास्ता। मैंने लेगाटो के नेटवर्कर बैकअप सॉफ्टवेयर को स्ट्रेस के दौरान 'सच्चा' पथ प्राप्त करने की विधि के रूप में देखा है (लेकिन शायद निरपेक्ष नहीं)। लेकिन यह उपरोक्त की तुलना में बहुत अधिक कोड होगा।
ericslaw

निश्चित नहीं कि किसी ने $ 0 के बजाय $ 1 का उपयोग करने के लिए कोड को संशोधित क्यों किया। $ 1 बैश स्क्रिप्ट के लिए पहला arg नहीं है? मैं निष्पादन बैश स्क्रिप्ट के लिए रास्ता चाहता था, न कि यह पहला तर्क है।
एरिकाक्लाव

27
#!/usr/bin/env bash
scriptDir="$(cd "$(dirname "$0")" && pwd -P)"

MacOSX में भी काम करता है।
१०:१० बजे अलेकर

1
यह सुपर है! कई अन्य अति जटिल उत्तर हैं जो चारों ओर तैर रहे हैं।
जेसन एस

3
यह केवल सिम्लिंकड डायरेक्टरी में फाइलों के लिए काम करता है, सामान्य रूप से सिम्लिंक की गई फाइलों के लिए नहीं
गेरहार्ड बर्गर

1
unset -v CDPATHसीडी से पहले यह भी उपयोगी है क्योंकि सीडी सीडीएटीएच सेट होने पर अवांछित उत्पादन का कारण बन सकता है।
बाइनरी फ़िले

फ़ाइल की सहानुभूति की कम से कम एक परत से निपटने के लिए, आप रीडलिंक के साथ संगत तरीके से भी परीक्षण कर सकते हैं (macs है -f नहीं): scriptDir=$(unset -v CDPATH; cd "$(dirname "$(readlink "$BASH_SOURCE" || echo "$BASH_SOURCE)")" && pwd -P)
बाइनरी फ़िले

0

यह सीमलिंक के कॉम्बो को संभालता है, और यह फाइलों और फ़ोल्डरों पर काम करता है:

#!/usr/bin/env bash
realpath()
{
    if ! pushd $1 &> /dev/null; then 
        pushd ${1##*/} &> /dev/null
        echo $( pwd -P )/${1%/*}
    else
        pwd -P
    fi
    popd > /dev/null
}

लेकिन यह realpath के --relative-to का समर्थन नहीं करता है। इसके लिए यहां वर्णित रूपांतरण की आवश्यकता होगी ।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.