मेरे LD_LIBRARY_PATH को अनसेटिंग लॉन्च टर्मिनल क्यों मिलता है?


8

मेरे पास कुछ पर्यावरण चर स्थापित करने और एक तर्क के रूप में मेरे द्वारा भेजे जाने वाले कार्यक्रम को लॉन्च करने के लिए एक शेल स्क्रिप्ट है:

export PATH=$HOME/local/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
export TESTER="MY TEST VAR"

$@

जब मैं इसका उपयोग bashउदाहरण के लिए कॉल करने के लिए करता हूं तो यह काम करता है:

kjfletch@flatbed:~$ envrun.sh bash
kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH
/home/kjfletch/local/lib:
kjfletch@flatbed:~$ echo $TESTER
MY TEST VAR

जब मैं इसका इस्तेमाल एक टर्मिनल कॉल करने के लिए ( xterm, aterm, ...) मेरी LD_LIBRARY_PATHसेट नहीं हो जाता है:

kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH

kjfletch@flatbed:~$ echo $TESTER

MY TEST VAR

ऐसा क्यों होता है? मैं इसे कैसे रोक सकता हूँ? (मैं डेबियन 5.0 चला रहा हूं)

अपडेट करें

मेरा टर्मिनल बैश को लॉगिन नहीं कह रहा है:

kjfletch@flatbed:~$ echo $0
bash

मेरा LD_LIBRARY_PATHकोई भी बैश स्टार्टअप फाइलों में नहीं दिखा है (इसके अलावा .bash_history और ~ / .prof के पास मौजूद नहीं है।):

kjfletch@flatbed:~$ grep "LD" ~/.bash*
kjfletch@flatbed:~$ grep "LD" /etc/bash.bashrc 
kjfletch@flatbed:~$ grep "LD" /etc/profile 

उन स्टार्टअप फ़ाइलों में से कोई भी "स्रोत" कमांड या "" कहलाता है। अन्य स्टार्टअप स्क्रिप्ट में लाने के लिए कमांड? यदि हां, तो उनमें से एक अपराधी हो सकता है।
केविन पैंको

आपके प्रश्न का उत्तर नहीं देता है, लेकिन LD_LIBRARY_PATH (कारणों: 1 2 3 ) की आवश्यकता से छुटकारा पाने के लिए वास्तव में अच्छी बात होगी । उदाहरण के लिए, आप /etc/ld.so.conf को संपादित कर सकते हैं, या जो कुछ भी उपयोगकर्ता-परिभाषित लिबास आप में / / स्थानीय तरीके से संकलित कर सकते हैं, वे यह जानते हैं कि उन्हें कहां से अपने पुस्तकालयों को देखना है (देखें लिंक मैंने दी)।
देवसोलर

जवाबों:


9

टर्मिनल बाइनरी setgidसमूह के लिए सबसे अधिक संभावना है utmpLD_LIBRARY_PATHसुरक्षा कारणों से सेतु और सेटगाइड बायनेरिज़ परेशान ; देखें ld.so(8):

कार्यक्रम के लिए आवश्यक आवश्यक साझा पुस्तकालय निम्नलिखित क्रम में खोजे जाते हैं

  • पर्यावरण चर LD_LIBRARY_PATH( LD_AOUT_LIBRARY_PATHa.out प्रोग्राम के लिए) का उपयोग करना । सिवाय इसके कि निष्पादन योग्य एक सेतु / सेगिड बाइनरी है, जिस स्थिति में इसे अनदेखा किया जाता है।

4

टर्मिनल (xterm, aterm आदि) में, जांचें कि शेल को कैसे लगाया गया था: एक लॉगिन शेल "-बैश" दिखाएगा और कॉल करने पर एक गैर-लॉगिन शेल "बैश" दिखाएगा echo $0

$ echo $0
-bash
$ bash
$ echo $0
bash

एक लॉगिन बैश शेल निम्न क्रम में पढ़ेगा:

  1. / Etc / प्रोफ़ाइल
  2. ~ / .Bash_profile
  3. ~ / .Bash_login
  4. ~ / .Profile

जाँच करें कि क्या इनमें से कोई भी फ़ाइल मौजूद है, और यदि वे चर को रीसेट करते हैं। आपको इन फ़ाइलों में शामिल किसी भी फ़ाइल का पालन करना होगा।

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

  1. /etc/bash.bashrc
  2. ~ / .Bashrc

बैश शेल के प्रकार को निर्धारित करने का एक सरल तरीका है क्रमशः अपने .bash_profile और .bashrc, और इको "लॉगिन शेल" और "इंटरएक्टिव शेल" को परिभाषित करना।

एक बार जब आपको पता चल जाता है कि शेल किस प्रकार का है, तो आपके पास अपनी होम डायरेक्टरी में अपनी स्क्रिप्ट को .bashrc या .bash_profile फ़ाइल में जोड़ने का विकल्प है। वैकल्पिक रूप से, आप LD_LIBRARY_PATH के रीसेट को अक्षम कर सकते हैं।

ध्यान दें कि यदि आपकी .bashrc या .bash_profile को नीचे के समान गार्ड द्वारा संरक्षित किया जाता है, तो आपको इसके बाहर अपनी स्क्रिप्ट को कॉल करना पड़ सकता है:

if [ "X$BASH_SOURCED" != "XYES" ]; then
        export BASH_SOURCED=YES

fi

इस तरह के पहरे को आमतौर पर एक सत्र में कई बार स्क्रिप्ट को रोकने के लिए रखा जाता है।

संपादित करें: यदि यह चर को ट्रैक करने के लिए साबित हो रहा है जहां चर को रीसेट किया जा रहा है, और आपके पास / etc / प्रोफ़ाइल या /etc/bash.bashrc तक पहुंच है, उदाहरण के लिए, आप अस्थायी रूप से "सेट -x" जोड़ सकते हैं शीर्ष के पास स्क्रिप्ट सभी आदेशों को देखने के लिए जिन्हें निष्पादित किया जाता है। आउटपुट बहुत अच्छा होगा, इसलिए पहले अपने शेल में एक "सेट -x" करें और कुछ कमांड चलाएं ताकि आप जान सकें कि क्या उम्मीद है।


जानकारी के लिए +1 धन्यवाद। मैंने आपके उत्तर के जवाब में अपना ओपी अपडेट कर दिया है।
15:22 बजे kjfletch

क्या आप एक ही व्यवहार देखते हैं यदि आप एक ही टर्मिनल पर एक नया bash शेल टाइप करके bash टाइप करते हैं? Btw, आपको उन फ़ाइलों को भी जांचना होगा जो /etc/bash.bashrc और / etc / प्रोफाइल के भीतर से कॉल की जाती हैं - उनमें से एक वेरिएबल को अनसेट कर सकती है। वैकल्पिक रूप से, set -xडिबग विकल्प का उपयोग करके शेल बनाए जाने के समय से होने वाली हर चीज़ का डंप प्राप्त करें।

set -xडंप LD_LIBRARY_PATH को कोई चर्चा नहीं करता। प्रेत परेशान।
kjfletch

4

बैश कैसे शुरू होता है, इसके आधार पर अलग-अलग स्टार्ट-अप स्क्रिप्ट का उपयोग करेगा। इसे शुरू करने के सात अलग-अलग तरीके हैं, लेकिन सबसे महत्वपूर्ण हैं लॉगिन गोल्स बनाम गैर-लॉगिन इंटरैक्टिव गोले।

की जाँच करें बैश पुस्तिका अधिक जानकारी के लिए। मुझे शक होगा / etc / प्रोफाइल या ~ / .bash_profile LD_LIBRARY_PATH चर को रीसेट करने के लिए कुछ कर रहा है।


संपादित करें: मुझे लगता है कि आप सभी ने यथोचित रूप से यह दिखाने के लिए किया है कि बैश में कोई स्टार्टअप स्क्रिप्ट नहीं है जो LD_LIBRARY_PATH को अनसेट करती है। बड़ी तोपों को लाने का समय आ गया है।

निम्न आदेश पूरे वातावरण को प्रदर्शित करेगा जैसा कि प्रत्येक प्रक्रिया शुरू होती है, बैश से लेकर xterm तक, और कुछ भी जो इसमें शामिल होता है - आपको संभवतः बड़ी मात्रा में आउटपुट मिलेगा, इसलिए आउटपुट को फ़ाइल में सहेजना एक अच्छा विचार है ।

strace -v -f -e trace=process -o strace_output.txt envrun.sh xterm

अब, फ़ाइल strace_output.txt आपकी स्क्रिप्ट और प्रत्येक चाइल्ड प्रोसेस द्वारा किए गए प्रत्येक सिस्टम कॉल को दिखाएगा, और आप यह देख पाएंगे कि एलडी_आईबीआरआरआई_पीएटीएच को हटाने से पहले कौन सी प्रक्रिया अंतिम थी।


2

(यह सवाल बहुत पुराना है, लेकिन मुझे बस एक ही समस्या का सामना करना पड़ा है, और मैं पश्चाताप के समाधान का दस्तावेजीकरण कर रहा हूँ :)

मुझे जीएनयू स्क्रीन (टर्मिनल मल्टीप्लेक्स) के साथ यह समस्या है, लेकिन यह नियमित टर्मिनल के साथ भी हो सकता है। मेरे मामले में टेडी सही था, स्क्रीन पर सेटगाइड सेट है।

$ ls -l /usr/bin/screen
-rwxr-sr-x 1 root 84 361016 Mar 30  2011 /usr/bin/screen
      ^

मेरा समाधान निष्पादन से पहले LD_LIBRARY_PATH को सहेजना था, और बाद में इसे पुनर्स्थापित करना था। तो मैंने निम्न सामग्री के साथ एक रैपर ~ / बिन / स्क्रीन (~ पर बिन रखें) बनाया,

#!/bin/bash

# somehow, screen resets LD_LIBRARY_PATH.
# save it here, and restore it in .bashrc
export PRESERVE_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
/usr/bin/screen "$@"

और फिर इसे निष्पादन योग्य बना दिया chmod +x ~/bin/screen। रैपर को लेने के लिए आपको एक नया खोल खोलना पड़ सकता है।

फिर मैंने निम्नलिखित को ~ / .bashrc में जोड़ दिया। याद रखें ~ / .bashrc हर बार जब आप बैश शुरू करते हैं, तो इसके विपरीत ~ / .bash_profile जो केवल लॉगिन पर (आमतौर पर स्टार्टअप पर, या जब आप ssh पर लॉग इन करते हैं) खट्टा हो जाता है।

if [[ "$PRESERVE_LD_LIBRARY_PATH" != "" ]]; then
    export LD_LIBRARY_PATH="$PRESERVE_LD_LIBRARY_PATH"
    #echo "restored LD_LIBRARY_PATH"
    export -n PRESERVE_LD_LIBRARY_PATH
fi

अब स्क्रीन (या aterm, xterm, ... बस इसके ऊपर विकल्प दें) को $ LD_LIBRARY_PATH को संरक्षित करना चाहिए जैसा कि वे चाहते थे।


तुम भी बहाल कर सकते हैं LD_LIBRARY_PATHमें .screenrc(बजाय .bashrc): setenv LD_LIBRARY_PATH "$PRESERVE_LD_LIBRARY_PATH"द्वारा पीछा कियाunsetenv PRESERVE_LD_LIBRARY_PATH
nandhp

0

ऐसा लगता है कि आपके पास अपनी होम निर्देशिका में कुछ .bashrc (या समतुल्य) फ़ाइल है जो इस चर को परिभाषित करती है। मैं हालांकि अधिक जानकारी नहीं जानता।

ठीक है, काम शुरू करने के बाद से संपादित करें , मैं नहीं .bashrc अनुमान लगा रहा हूं । लेकिन हो सकता है कि कुछ अन्य कॉन्फ़िगरेशन फ़ाइल जो उसी तरह निष्पादित हो, जब आप xterm या aterm शुरू करते हैं।


यह मेरा मूल विचार था। बहुत खोजने के बाद भी कुछ नहीं मिला है। मुझे बहुत साफ (NEW) $ HOME होने का फायदा है।
kjfletch

0

जब वे टर्मिनल विंडो लॉन्च करते हैं, तो अधिकांश विंडोिंग सिस्टम लॉगिन प्रक्रिया को फिर से बनाते हैं, मुख्यतः क्योंकि टर्मिनल विंडो लॉन्चिंग शेल का नहीं विंडो मैनेजर का बच्चा बन जाता है।

इसलिए, यदि आप इसे एक नई विंडो में दिखाना चाहते हैं, तो इसे अपने .bash_profile या .bashrc में डालें।

एक अन्य विकल्प है xterm (उदाहरण के लिए) एक स्टार्टअप स्क्रिप्ट को चलाने के लिए तर्क देना। उस स्क्रिप्ट के अंत में बाहर मत जाओ ...।


मुझे लगता है कि मुझे इसका सहारा लेना पड़ेगा। मैं शायद दोनों में अपने पर्यावरण चर स्रोत कर सकते हैं। तो मेरे खिड़की प्रबंधक उन्हें है, और .bashrc इतना है कि मेरे टर्मिनल खिड़कियां उन्हें होगा।
kjfletch
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.