डुप्लिकेट पथ, .bash_profile के साथ समस्याएँ

Aug 16 2020

काम के लिए PyExifTool प्राप्त करने के लिए संघर्ष करने के बारे में एक प्रश्न पोस्ट करने के बाद मुझे स्टैक ओवरफ्लो से यहां निर्देशित किया गया था । हालांकि ऐसा लगता है कि समस्या बहुआयामी थी और नौसिखिया होने के कारण मुझे यहां मदद लेने के लिए कहा गया था।

अनिवार्य रूप से समस्या का एहसास हुआ जब मुझे चलाने के लिए कहा गया था ...

bash:~ $ type -all exiftool

जो लौट आया ...

exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool

... यह खुलासा करते हुए कि कहीं न कहीं मैंने नकल की थी।

इसके बाद, मैं भाग गया ...

bash:~ $ echo $PATH

जो लौट आया ...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

... जिसमें डुप्लिकेट शामिल हैं और जाहिर तौर पर इसके साथ समाप्त नहीं होना चाहिए .bash_profile

अब टर्मिनल में, मैं इसका उपयोग करके साफ कर सकता हूं ...

bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')

ऊपर एक स्निपेट है जो मुझे लिनक्स जर्नल से मिला है जो कि 'लगभग काम' करने वाला है, लेकिन कोड का जो 'काम करना चाहिए' वह मेरी मदद नहीं करता है। 'लगभग कार्यात्मक' कोड का उपयोग निम्नलिखित देता है:

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile :

मैं पूरी तरह से नौसिखिया हूं, लेकिन मुझे नहीं लगता कि यह समाप्त होना चाहिए :और स्पष्ट रूप .bash_profileसे अभी भी मौजूद है। हालाँकि, यह डुप्लिकेट को हटाने के लिए प्रतीत होता है, हालांकि यह रीसेट करता है अगर मैं एक नया टर्मिनल विंडो खोलता हूं तो यह केवल एक तीव्र बदलाव है।

यह मेरा बैश प्रोफ़ाइल जैसा दिखता है:

export PATH=/usr/local/bin:$PATH~/.bash_profile # Setting PATH for Python 3.6 # The original version is saved in .bash_profile.pysave #PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
#export PATH

# Setting PATH for Python 2.7
# The original version is saved in .bash_profile.pysave
#PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}" #export PATH # FSL Setup FSLDIR=/usr/local/fsl PATH=${FSLDIR}/bin:${PATH} export FSLDIR PATH . ${FSLDIR}/etc/fslconf/fsl.sh


# Setting PATH for Python 3.8
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
export PATH

मुझे यकीन नहीं है कि यह प्रासंगिक या संबंधित है, लेकिन जब मैं अपने हॉटबार से अजगर लॉन्च करता हूं और चलाता हूं ...

>>> print(os.environ['PATH'])

यह प्रिंट करता है

/usr/bin:/bin:/usr/sbin:/sbin

जब मैं अपने बैश टर्मिनल से IDLE3इसे लौटाता हूं, तब इसे लॉन्च करता हूं :

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

परिधीय सूचना और प्रयोग:

मुझे लगता है कि एफएसएल स्थापित करते समय मैंने शायद कुछ गड़बड़ कर दी थी, मेरे लिए कुछ किया .bash_profileऔर अब बुनियादी कोडिंग कौशल सीखने और विकसित करने की कोशिश करते हुए प्रेतवाधित हो रहा है। हो सकता है कि यह एक मैनुअल त्रुटि थी या शायद इसका होमब्रेव या एक्सकोड के साथ कुछ करना था।

मैं .bash_profileअंत को नष्ट कर सकता था, लेकिन मैं चिंतित हूं कि मैं पहले ही काफी नुकसान कर चुका हूं और अपने आप को एक समस्या में समस्याग्रस्त नहीं करना चाहता हूं इसलिए कोई भी श्रमिक मंच इसे छूना नहीं चाहता है।

यह लिनक्स जर्नल से मिच फ्रेज़ियर के अनुसार काम करने वाला था । जाहिर है कि यह उस पर या लेख पर कोई प्रतिबिंब नहीं है, बल्कि मेरी सीमित समझ पर है।

bash:~ $ export PATH=/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile
bash:~ $ echo -n $PATH | awk -v RS=: '!($0 in a) {a[$0]; printf("%s%s", length(a) > 1 ? ":" : "", $0)}'

यह रिटर्न ...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profileUser's-MBP:~ username$

मैंने निम्नलिखित भी कोशिश की है ( pepa65 द्वारा सुझाया गया है ) ...

bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")

यह रिटर्न ...

-bash:  -1: substring expression < 0

जब मैं परिवर्तनों का उपयोग करने की कोशिश करता हूं echo $PATH...

मुझे एक ब्लैंक लाइन मिलती है।

मुझे पता है कि यह बौद्धिक रूप से उत्तेजक होने की संभावना नहीं है इसलिए मैं किसी भी मदद के लिए आभारी हूं।

संपादित करें 1:

.bash_profileमेरी पहली पंक्ति के अंत से हटाने की एक भोली कोशिश .bash_profileने इसे उस आउटपुट से गायब नहीं किया, echo $PATHजो अपरिवर्तित रहा।

जवाब

tripleee Aug 16 2020 at 14:21

यहाँ एक कम और सुधारा गया है .bash_profileजो आपके विन्यास के लिए यथोचित रूप से पर्याप्त है।

शुरुआत में एक समस्याग्रस्त रेखा थी जहां ~/.bash_profileगलत तरीके से एक अन्यथा सही रेखा में जोड़ा गया था। हालाँकि, मैंने पूरी पंक्ति को हटा दिया, क्योंकि मुझे उम्मीद थी, और आपके निदान का सुझाव है, कि यह एक निर्देशिका जोड़ रहा था जो पहले से ही सिस्टम-आपूर्ति डिफ़ॉल्ट पर था PATH

निश्चित रूप export PATHसे एक से अधिक बार करने की आवश्यकता नहीं है ; शायद आप सुरक्षित रूप से एक भी शेष उदाहरण निकाल सकते हैं। इसका मतलब है exportकि एक चर को एक पर्यावरण चर में बनाया जाना है जो उपप्रोसेस को दिखाई देता है। एक बार जब आप ऐसा कर लेते हैं, तो उपप्रोसेस के पास वैरिएबल के वर्तमान मूल्य तक पहुंच होगी, भले ही मान में परिवर्तन हो export। काफी शायद आपके सिस्टम-वाइड शेल कॉन्फ़िगरेशन पहले से ही PATHचर के लिए ऐसा करता है (अन्यथा यह काम नहीं कर सकता)।

मैंने पूरे खंडों को हटा दिया, जिन पर टिप्पणी की गई थी; आप निश्चित रूप से उन्हें वापस लाना चाहते हैं और उन्हें असहज कर सकते हैं।

# FSL Setup
FSLDIR=/usr/local/fsl
PATH=${FSLDIR}/bin:${PATH}
export FSLDIR PATH
. ${FSLDIR}/etc/fslconf/fsl.sh # Setting PATH for Python 3.8 # The original version is saved in .bash_profile.pysave PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"

यह फ़ाइल तब पढ़ी जाती है जब आप एक नया शेल शुरू करते हैं, हालांकि जब वास्तव में यह भी निर्भर करेगा कि आपके ओएस विक्रेता ने बैश को कैसे कॉन्फ़िगर किया है। यह सुनिश्चित करने के लिए कि कोई पुराना कॉन्फ़िगरेशन अब आपके वर्तमान कॉन्फ़िगरेशन में हस्तक्षेप नहीं कर रहा है, आपको यह पता लगाना होगा कि लॉगिंग आउट और बैक को शुरू करने के लिए आवश्यक है, या यदि आप बस एक नया शेल या नया टर्मिनल सत्र शुरू कर सकते हैं एक साफ स्लेट प्राप्त करें।

शायद अभी भी समीक्षा करें कि क्या .bash_profile.pysaveकुछ उपयोगी है जिसे आप रखना चाहते हैं, हालांकि मैं अपेक्षा करता हूं कि यह आपके वर्तमान संस्करण के समान और बड़े समान होगा, सिवाय रेखाओं के बहुत अंतिम सेट के।