जीएनयू स्क्रीन 10.5.8 पर मेरे पेट को विरासत में नहीं मिलेगा


11

मैं अपनी टर्मिनल जरूरतों के लिए दैनिक आधार पर स्क्रीन का उपयोग करता हूं और मैं इससे काफी खुश हूं। हाल ही में, हालांकि, मैं कुछ अपडेट मेरी पार्टी विन्यास फाइल करने के लिए बनाया गया है और मैंने देखा है कि मैं विभिन्न स्थापित करने गया था PATHतत्वों ( PATH, MANPATH, INFOPATH2 स्थानों में, आदि)। मैंने फाइलों को संशोधित किया कि वे क्या होनी चाहिए और अब मेरे सभी पर्यावरण चर एक बार में सेट हो जाते हैं .bash_profile। इसमें मेरी समस्या है।

जाहिर है, मैं उन्हें दो जगहों पर सेट कर रहा था स्क्रीन की वजह से। स्क्रीन केवल निष्पादित करने के लिए प्रकट होती है .bashrcऔर मेरे मूल बैश शेल से मेरे या किसी अन्य पर्यावरण चर को सही तरीके से प्राप्त करने के लिए प्रकट नहीं होती है PATH। क्योंकि यह केवल निष्पादित करता है .bashrcऔर मैं अब .bash_profileकेवल अपने चर सेट करता हूं , मुझे अधूरा मिलता है PATH

मेरा सवाल यह है कि, नकल के बिना स्क्रीन में मेरे पर्यावरण चर कैसे प्राप्त करें। Bashडॉक्स के माध्यम से पढ़ने से प्रतीत होता है कि यह उस तरह का शेल हो सकता है , जिसका उपयोग स्क्रीन लॉग इन करने के लिए करता है, अर्थात एक गैर-लॉगिन इंटरेक्टिव शेल लेकिन मैं यह पता नहीं लगा सका कि स्क्रीन को किसी विशेष प्रकार के शेल का उपयोग करने के लिए कैसे बाध्य किया जाए, केवल के माध्यम से उपयोग करने के लिए खोल -s /bin/bash

आप मेरे GitHub पेज पर मेरे कॉन्फिगर फाइल को देख सकते हैं । यह कमिटेड कमेटी है जिसने स्क्रीन को तोड़ा

संपादित करें: मैं उपयोग कर रहा हूं Screen version 4.00.03 (FAU) 23-Oct-06और मैं इसे लागू करना चाहता हूंscreen -h 50000

संपादित करें: मैं अब साइग्विन ( CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686, Screen version 4.00.03 (FAU) 23-Oct-06) पर इसका परीक्षण करने में सक्षम हूं और यह मेरे मैक की तुलना में अलग व्यवहार प्रदर्शित करता है।

विशिष्ट व्यवहार जो मैंने अब खोजा है वह यह है कि सिग्विन में जो परिवर्तन मैं करता हूं उसमें PATH.bash_profile स्क्रीन पर प्रवेश करने पर डुप्लिकेट हो जाता है और फिर स्क्रीन विंडो का क्रमिक निर्माण पथ की नकल नहीं करता है, लेकिन re-source .bash_profile करता है।

मैं जिस व्यवहार के बारे में बात कर रहा हूं, उसे स्पष्ट करने के लिए:

एक नए टर्मिनल से आउटपुट:

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

स्क्रीन के पहले आह्वान से आउटपुट:

[~]$ screen -h 50000 -s -/bin/bash

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

इसके बाद कॉल C-a c:

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

आप देख सकते हैं


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

जवाबों:


16

स्क्रीन और पर्यावरण चर

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

मान लें कि न तो आपके शेल का कॉन्फ़िगरेशन, और न ही स्क्रीन का कॉन्फ़िगरेशन FOOBAR नामक एक चर को संशोधित करेगा (काफी संभावना है, सभी में)। यदि आप के साथ एक सत्र शुरू करते हैं FOOBAR=foo screen, तो उस सत्र में बनाए गए सभी गोले में एक पर्यावरण चर होगा जिसका नाम FOOBAR है जिसका मान है foo

चर के लिए चीजें अधिक जटिल हो जाती हैं जो स्क्रीन या आपके शेल को संशोधित कर सकती हैं।

स्क्रीन का उपयोग करते समय लापता सेटिंग्स

शेल्स लॉगिन करें

यदि आप पाते हैं कि स्क्रीन द्वारा शुरू किए गए गोले में कुछ सेटिंग्स गायब हैं , तो ऐसा इसलिए हो सकता है क्योंकि आपका शेल केवल उन सेटिंग्स को अपडेट करने के लिए कॉन्फ़िगर किया गया है जो 'लॉगिन' शेल हैं। अधिकांश गोले एक विशेष सम्मेलन (सी: में **argv == '-') को समझते हैं जिसे उपयोग करने के लिए स्क्रीन को कॉन्फ़िगर किया जा सकता है।

प्रति स्क्रीन प्रलेखन :

शेल कमांड

एक नया शेल बनाने के लिए उपयोग की जाने वाली कमांड सेट करें। यह पर्यावरण चर $ SHELL के मूल्य को ओवरराइड करता है। यह उपयोगी है अगर आप ट्टी-एन्हांसर को चलाना चाहते हैं, जो कि कार्यक्रम को निष्पादित करने की उम्मीद कर रहा है - $ SHELL में निहित है। यदि कमांड '-' वर्ण से शुरू होती है, तो शेल को लॉगिन-शेल के रूप में शुरू किया जाएगा।

करवाने के लिए स्क्रीन , 'लॉगिन' शेल के रूप में शुरू गोले शुरू स्क्रीन के साथ screen -s -/bin/bash, या अपने में यह पंक्ति जोड़ .screenrc:

shell -/bin/bash

जिस भी शेल का आप उपयोग कर रहे हैं उसके पथ के लिए समायोजित करें।

स्क्रीन कॉन्फ़िगरेशन

गुम या रीसेट वातावरण चर भी कारण हो सकता है setenvऔर unsetenvएक में आदेश स्क्रीन विन्यास फाइल। आपको अपने होम डायरेक्टरी में .penrc दोनों को चेक करना होगा और जो भी आपकी स्क्रीन की कंप्लेन फाइल है वह 'सिस्टम स्क्रीन आर्क' के रूप में उपयोग कर रहा है (आप एक कमांड को ट्राई कर सकते हैं जैसे strings "$(which screen)" | fgrep -i screenrcउस पाथनाम को खोजने के लिए जिसे कंपाइल टाइम में कॉन्फ़िगर किया गया था- यह आमतौर पर है / आदि / सिस्टम-स्थापित स्क्रीन के लिए स्क्रीन आर्क ; ऐड-ऑन इंस्टॉलेशन शायद कुछ अन्य पथनाम का उपयोग करेंगे)। आप SCREENRC=/dev/null SYSSCREENRC=/dev/null screenइन सेटिंग्स फ़ाइलों से अस्थायी रूप से बचने के लिए उपयोग कर सकते हैं , लेकिन एक संकलन-समय विकल्प है जो SYSSCONENC के प्रभावी उपयोग को रोकता है (संभवत: इसलिए कि सिस्टम प्रशासक कुछ प्रारंभिक कॉन्फ़िगरेशन के लिए बाध्य कर सकते हैं)।

स्क्रीन का उपयोग करते समय डुप्लिकेट सेटिंग्स

शेल के कॉन्फ़िगरेशन फ़ाइल (एस) में पीएटीएच जैसे पर्यावरण चर में आइटम जोड़ना काफी सामान्य है ताकि अपडेट किया गया मान सामान्य शेल सत्र (जैसे xterm या अन्य टर्मिनल विंडो, कंसोल सत्र, आदि) के लिए उपलब्ध हो। यदि इस तरह के आइटम को शेल के प्रति-शेल कॉन्फ़िगरेशन में जोड़ा जाता है (या, यदि आप शेल-प्रति-कॉन्फ़िगरेशन कॉन्फ़िगरेशन -/path/to/shellमें ऊपर वर्णित सेटिंग का उपयोग कर रहे हैं ), तो स्क्रीन द्वारा शुरू किए गए शेल में संभवतः जोड़े गए आइटमों की कई प्रतियां होंगी।

इससे बचने के लिए एक रणनीति यह है कि अपने शेल के प्रति-लॉगिन कॉन्फ़िगरेशन में PATH जैसे चरों को सभी जोड़ दिया जाए और स्क्रीन के-/path/to/shell साथ शेल सेटिंग का उपयोग करने से बचें ।

एक अन्य रणनीति केवल नई वस्तुओं को परिवर्तनीय रूप से जोड़ना है। शेल के आधार पर, ऐसा करने का कोड थोड़ा जटिल हो सकता है, लेकिन इसे आमतौर पर आसान उपयोग के लिए शेल फ़ंक्शन में समझाया जा सकता है।

फिर भी एक और रणनीति हमेशा आपके कॉन्फ़िगरेशन फ़ाइलों में एक निश्चित मूल्य के साथ शुरू होती है। यह कभी-कभी समस्याओं का कारण बन सकता है जब आपके कॉन्फ़िगरेशन फ़ाइलों को सिस्टम से सिस्टम में स्थानांतरित किया जाता है जब डिफ़ॉल्ट मान काफी भिन्न हो सकते हैं।

निदान

यदि आप सीधे स्पॉट नहीं कर सकते हैं जहां एक विशेष संशोधन हो रहा है, तो आप नीचे ट्रैक करने की कोशिश कर सकते हैं जहां परिवर्तन हो रहा है।

अपने प्रारंभिक शेल में वर्तमान मूल्य की जाँच करें:

echo "$PATH"

एक उप-शेल बनाए जाने पर शेल स्वयं मूल्य को कैसे संशोधित करता है, इसकी जाँच करें:

/bin/bash -c 'echo "$PATH"'

'लॉगिन' सब-शेल बनाए जाने पर शेल मान को कैसे बदलता है, इसकी जाँच करें:

perl -e '$s=shift;exec {$s} "-$s", @ARGV or die "unable to start shell"' /bin/bash
echo "$PATH"
exit

जाँचें कि स्क्रीन कैसे मान को संशोधित करती है:

printf '#!/bin/sh\nl=/tmp/echo-var.log;rm -f "$l"; echo $PATH >"$l"' >/tmp/echo-var &&
chmod a+x /tmp/echo-var &&
screen -s /tmp/echo-var &&
cat /tmp/echo-var.log

यह मेरी समस्या का एक हिस्सा है। दुर्भाग्य से यह पूरा रास्ता तय नहीं करता है। अब, स्क्रीन के साथ ठीक काम कर रहा है, screen -s -/bin/bashलेकिन यह व्यवहार नहीं करता है जैसा कि मुझे उम्मीद है कि मैं अपने काम की मशीन पर Cygwin के तहत व्यवहार करने की उम्मीद कर रहा हूं। उस मशीन पर, मैं दौड़ता हूं screen -h 50000और यह PATHवास्तव में फ़ाइल को फिर से सोर्स किए बिना मेरी विरासत में मिलती है । यह हर बार जब मैं एक नई विंडो लॉन्च करता हूं, दोनों चलता है।
19

स्क्रीन प्रक्रिया का वातावरण हमेशा अपने बच्चों को विरासत में मिलना चाहिए (TERM जैसे सामान को छोड़कर जो इसे ओवरराइड कर सकता है)। कोशिश करो FOOBAR=baz screenऔर echo $FOOBARसे खोल खिड़कियों में जाँच करें screenऔर screen -s -/bin/bash। दोनों रूपों में होना चाहिए FOOBAR= baz। यदि आपका PATHसंशोधन किया जा रहा है, तो आपको यह पता लगाना होगा कि यह क्या कर रहा है। कोशिश करो SYSSCREENRC=/dev/null SCREENRC=/dev/null screen, अगर वह आपके PATHमाध्यम से जाने देता है , तो यह संभवतः एक setenv PATHमें /etc/screenrcया है ~/.screenrc। अन्यथा यह कुछ ऐसा है जो आप .bashrcकर रहे हैं।
क्रिस जॉन्सन

मैंने अपने उत्तर का एक बड़ा पुनर्लेखन / जोड़ दिया है।
क्रिस जॉन्सन

2

पिछली बार जब मैंने एक समान मुद्दा देखा था, तो मैंने screen -lस्क्रीन शुरू करते समय उपयोग करके इसे हल किया था ।

-lजब आप स्क्रीन को विंडो को डिफ़ॉल्ट रूप से लॉग इन करें (/ / / utmp प्रविष्टि को जोड़कर) लॉग इन करें, यह निर्धारित करने के लिए आप विकल्प का उपयोग कर सकते हैं screen( प्रवेश मोड को चालू defloginऔर loginआदेशों द्वारा नियंत्रित किया जाता है .screenrc)।

लॉगिन मोड डिफ़ॉल्ट रूप से चालू है, लेकिन इसे संकलन समय पर बदला जा सकता है। यदि स्क्रीन utmp समर्थन के साथ संकलित नहीं है, तो ये कमांड उपलब्ध नहीं हैं।

मुझे -lडेबियन लेनी की डिफ़ॉल्ट स्क्रीन (v4.0.3) में मोड की आवश्यकता नहीं लगती है ; यह डिफ़ॉल्ट रूप से होने लगता है। मेरी ~/.profileऔर ~/.bashrcसही ढंग से पढ़ी जा रही है। कैसे आह्वान कर रहे हैं screen? आप कौन सा संस्करण उपयोग कर रहे हैं?


इस सिद्धांत के तहत, मेरी नहीं चलना screen -lnचाहिए , और यह अभी भी चला जाता है। इसलिए ध्वज का प्रयास करें , लेकिन यह शायद सही उत्तर नहीं है। पल के लिए यहाँ छोड़ देंगे। ~/.profile-l
क्वैक को

ऐसा लगता है कि -lकेवल यह नियंत्रित करता है कि क्या फ़ाइल में screenकोई प्रविष्टि जोड़ी जाती है utmp, यह नहीं कि क्या यह अपने स्वयं के -lविकल्प के साथ नए गोले को आमंत्रित करता है या निष्पादन-के साथ --प्रत्यय कस्टम का उपयोग करता है ।
क्रिस जॉन्सन

2

समस्या तेंदुए पर लॉन्च व्यवहार के साथ है। तेंदुए पर स्क्रीन के लिए इस MacPorts बग रिपोर्ट को देखें कि यह कभी भी तय क्यों नहीं हो रहा है जब तक कि आप किसी तरह स्नो लेपर्ड के लॉन्च को बैकपोर्ट नहीं कर सकते।

https://trac.macports.org/ticket/18235#comment:26


1

आपके .bashrc को .bash_profile से सोर्स करने में कुछ भी गलत नहीं है। यदि आप केवल अपनी मशीन का स्थानीय स्तर पर उपयोग कर रहे हैं तो आपकी .bash_profile ज्यादातर मामलों में केवल तब ही खट्टी हो जाएगी जब आप अपना प्रारंभिक लॉगिन करते हैं (स्पष्ट रूप से अन्य समय में यह खट्टा हो जाता है)।

मैं अपनी फ़ाइलों को व्यवस्थित करता हूं ताकि यदि मैं चाहता हूं कि लॉगिन करते समय ही कुछ किया जाए, तो मैंने जानकारी को .bash_profile में और बाकी सभी चीज़ों के लिए डाल दिया। PATH एक चीज है जिसे मैंने अपने .bashrc में, और I .bashrc में अपने .bash_profile में डाला है।


क्या आप अपनी .bashrcऔर .bash_profileफाइलों को कहीं पोस्ट करने में सहज होंगे ताकि मैं उन्हें देख सकूं? कुछ ऐसा ही करते हुए मैं जिस समस्या में भाग गया था, वह PATHयह थी कि हर बार बढ़ने पर मैं एक नया स्क्रीन उदाहरण बनाऊंगा क्योंकि यह पुराने को विरासत में मिलाएगा PATHऔर फिर से सब कुछ फिर से जोड़ देगा।
टिम विश्वर 28'10

क्षमा करें टिम, मैंने यह नहीं देखा ... मैंने बहुत सारी चीजें बदल दी हैं ताकि वे बहुत समझ में न आएं, लेकिन यह मूल रूप से मैं क्या करता हूं। # .bash_profile अगर [-f ~ / .bashrc]; फिर । ~ / .bashrc fi तब मैंने उन सब चीजों को छोड़कर, जो मैं पहली बार लॉगिन करते समय शुरू करना चाहता हूं, को छोड़कर। PATH को एक पथ परिभाषा के बजाय .bashrc की एक श्रृंखला के रूप में संभाला जाता है जैसे कि PATH = / path / to / binaries1: $ PATH निर्यात PATH = / path / to / binaries2: $ PATH

0

जैसे कि मैं एक फ़ाइल बनाने जब भी मैं कुछ समस्या है $HOME/.debugऔर फ़ाइलों के सभी के स्रोत वाली / लॉगिन / खोल मंगलाचरण के दौरान निष्पादित (जैसे ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/bashrc, आदि) मैं पहली पंक्ति के रूप है

test -f $HOME/.debug && echo $HOME/.bashrc 1>&2

या इसी के समान। विशिष्ट डिबगिंग के लिए आप चीजों को भी जोड़ सकते हैं

test -f $HOME/.debug && echo PATH now equals $PATH 1>&2

इस तरह से आप 100% पूरी तरह से निश्चित हो सकते हैं कि कौन सी फाइलें उपयोग की जाती हैं या नहीं।

Stderr पर पुनर्निर्देशन महत्वपूर्ण है, आप कई स्थितियों में stdout को गड़बड़ाना नहीं चाहते हैं।


0

आप के साथ रह सकते हैं। क्योंकि सिस्टम bashrc (ग्राफिक्स सत्र की तरह) को नहीं छूता है। अब आपके पास बस पर्यावरण के दो अलग-अलग सेट हैं - एक .profile से, दूसरा bash से .bashrc के लिए।

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