2010-04-26 16 views
16

हमारे पास ओरेकल Solaris पर चल रहा है, और खोल डिफ़ॉल्ट csh है। तो लॉगिन स्क्रिप्ट csh में oracle_home, oracle_sid भी सेट करता है। लेकिन मुझे सीएसएस पसंद नहीं है और मैं अपना काम करने के लिए बैश का उपयोग करना चाहता हूं। तो bash में csh लॉगिन स्क्रिप्ट को स्रोत कैसे करें?पर्यावरण सेट करने के लिए bash में csh स्क्रिप्ट को स्रोत कैसे करें

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

स्रोत .cshr में कुछ ऐसा उपयोग करना अच्छा लगता है, लेकिन यह काम नहीं करता है।

 
setenv ORACLE_SID TEST 
setenv ORACLE_HOME /oracle/TEST/home/products/10204 
setenv EPC_DISABLED TRUE 
setenv MANPATH /usr/local/man:/usr/share/man 
setenv EDITOR vi 
setenv LD_LIBRARY_PATH $ORACLE_HOME/lib:/usr/sfw/lib/64 
setenv NLS_LANG AMERICAN_AMERICA.UTF8 
setenv NLS_DATE_FORMAT "DD-MON-RR" 
+1

सुपर उपयोगकर्ता या सर्वर फॉल्ट के लिए अधिक उपयुक्त है? – sblom

उत्तर

17

अपने ~/.bashrc में (या ~/.bash_profile, ~/.bash_login के पहले, और ~/.profile मौजूद है) स्रोत इस स्क्रिप्ट . ~/bin/sourcecsh की तरह कुछ का उपयोग कर:

#!/bin/bash 
# This should be sourced rather than executed 
# yes, it will be sourcing within sourcing - what so(u)rcery! 
source /dev/stdin < \ 
<(
    while read cmd var val 
    do 
     if [[ $cmd == "setenv" ]] 
     then 
      echo "export $var=$val" 
     fi 
    done < cshrc 
) 
:

#!/bin/bash 
# This should be sourced rather than executed 
while read cmd var val 
do 
    if [[ $cmd == "setenv" ]] 
    then 
     eval "export $var=$val" 
    fi 
done < ~/.cshrc 

इस संस्करण बुराई eval समाप्त

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

सोर्सिंग stdin के बिना:

cat .cshrc | sed 's/setenv\s+(\S+)\s+(.*)$/set $1=$2; export $1/' > $HOME/.env_from_csh 
source $HOME/.env_from_csh 
+0

@ डेनिस - अच्छा ... मुझे यह पसंद है क्योंकि यह शुद्ध बैश है (मेरा 'sed' का उपयोग करता है) ... मुझे यह स्वीकार करना होगा कि मैं अभी भी अपना संस्करण (काफी समान) पसंद करता हूं क्योंकि यह सेट कमांड की सूची रखता है बाद में समस्या निवारण या पर्यावरण बहाली के लिए फ़ाइल के रूप में बस :) – DVK

+1

मैं पहले संस्करण के लिए वोट दूंगा - सोर्सिंग stdin कम से कम परेशानी के रूप में 'eval' के रूप में है। –

1

एकमात्र तरीका मैं ऐसा करने के लिए सोच सकता हूं कि यह सीएसएच लोड करना होगा और फिर उस नए खोल से बैश को कॉल करना होगा। इस तरह सीएसएच उस फाइल को पार्स कर सकती है, और उसके बाद जो बाश उत्पन्न होती है वह उस पर्यावरण को भी प्राप्त करेगी।

+0

कोड में: '(cat .cshrc; echo exec $ SHELL) | csh' – reinierpost

-4

बैश में एक सीएसएच फ़ाइल सोर्सिंग काम नहीं करेगा। यदि आप बैश में अधिक confortable हैं तो आप csh से bash से डिफ़ॉल्ट लॉगिन खोल बदल सकते हैं। आप chsh या व्यवस्थापक के रूप में इसे बदलने के लिए उपयोग कर सकते हैं।

chsh -s /usr/local/bin/bash 
2

अपने बैश .profile में, आप निम्न कर सकते हैं लिपि निष्पादन योग्य बनाने के संयोजन के साथ स्क्रिप्ट मेरे लिए समस्या हल हो गई। मैं सीधे इस मामले में सीएसएच स्क्रिप्ट को बैश से कॉल कर सकता हूं।

उदाहरण के तौर पर, मुझे setup.sh नामक एक बैश स्क्रिप्ट से tools.csh चलाया जाना था। मैं bash लिपि में कुछ इस तरह किया:

if [ -z \`head -1 tools.csh | grep '^#!'\` ]; 
then 
    TCSH=\`which tcsh\`; 
    echo "'#!'$TCSH" > tools.csh.temp; 
    cat tools.csh >> tools.csh.temp; 
    mv tools.csh.temp tools.csh; 
fi; 
chmod 755 tools.csh; 
./tools.csh 
# now I have all the setenv commands effective ... 
+0

यह भी अच्छा है, मैं कुछ जंक फ़ाइल नहीं बनाना पसंद करता हूं। सुनिश्चित नहीं है कि हम अस्थायी फ़ाइल से बचने के लिए केवल पाइप का उपयोग कर सकते हैं या नहीं। – Daniel

+1

'बिल्ली' का बेकार उपयोग। बैश उस तरह से 'सेट' का उपयोग नहीं करता है। 'निर्यात' एक ही समय में वैरिएबल नाम और असाइनमेंट ले सकता है। आपको 'sed' के एक अलग संस्करण का उपयोग करना होगा क्योंकि यह पर्ल सिंटैक्स की तरह दिखता है। आपको '-r' का उपयोग करने या कोष्ठक और प्लस संकेतों से बचने की आवश्यकता है।आप इस तरह की अस्थायी फ़ाइल को खत्म कर सकते हैं: 'स्रोत/dev/stdin <<(sed's s/setenv \ s \ + \ (\ S \ + \) \ s \ + \ (। * \) $/Export \ 1 = \ 2/'.cshrc) ' –

+0

@ डेनिस और डैनियल - मैं आमतौर पर ** चाहता हूं कि **" जंक "अस्थायी फ़ाइल :) – DVK

-1

बस CSH के शुरू में एक "#!/bin/tcsh" या इसी तरह के बयान उपलब्ध होने:

while read cmd var val 
do 
    if [[ $cmd == "setenv" ]] 
    then 
     declare -x "$var=$val" 
    fi 
done < cshrc 
+1

यदि '।/Tools.csh' पर्यावरण चर सेट करता है, तो वे * कॉलिंग खोल से दिखाई नहीं देंगे। यदि कमांड वेरिएबल चर पर निर्भर करता है तो सभी '।/Tools.csh' में हैं, यह ठीक है। –

2

बस इतनी

setenv() { 
    echo setting $1 to $2 
    export $1=$2 
} 

की तरह एक समारोह setenv बुलाया परिभाषित करने, और फिर .cshrc फ़ाइल सोर्सिंग के बारे में कैसे।

जब मैं पार्टी में ऐसा करते हैं, मैं

[[email protected] ual-read-only]$ source cshrc 
setting ORACLE_SID to TEST 
setting ORACLE_HOME to /oracle/TEST/home/products/10204 
setting EPC_DISABLED to TRUE 
setting MANPATH to /usr/local/man:/usr/share/man 
setting EDITOR to vi 
setting LD_LIBRARY_PATH to /oracle/TEST/home/products/10204/lib:/usr/sfw/lib/64 
setting NLS_LANG to AMERICAN_AMERICA.UTF8 
setting NLS_DATE_FORMAT to DD-MON-RR 
[[email protected] ual-read-only]$ env | grep ORACLE 
ORACLE_SID=TEST 
ORACLE_HOME=/oracle/TEST/home/products/10204 
+0

बंद करें लेकिन कोई सिगार नहीं है। (1) सीएसएस स्रोत स्क्रिप्ट्स में से कुछ उपनाम सेट करते हैं - और मुझे नहीं पता कि सीएसएच से एलियास को बैश जैसे कॉलिंग खोल में कैसे निर्यात किया जाए। मुझे लगता है कि यह किसी भी सीएसआई उपनाम को बैश उपनाम में अनुवाद करने के लिए प्रोग्रामिंग का एक साधारण मामला है, और इसके विपरीत (बाद में नई सीएसएस स्रोत स्क्रिप्ट को कॉल करने के लिए)। (2) चूंकि मेरे सामान्य लॉगिन शैल में अतिरिक्त एनक्यूशनमेन चर हैं, इसलिए मुझे इसे पहले खाली करना होगा। और यही वह है जो मैं पूछ रहा हूं। (3), ओह, आपने अभी देखा है कि आप क्या कर रहे हैं: हाँ, मेरे पास कई सालों से बैश में एक सेटनव है। (दरअसल, चूंकि पहले बैश अस्तित्व में था, ksh में) –

4

मैं एक ही नाव में हूँ मिलता है।एक सहकर्मी मुझे पता चला है निम्नलिखित:

bash> echo $$ 
12632 
bash> echo $FOO 

यहाँ source'd हो जाता है कि csh फ़ाइल है:

thwe वातावरण में बैश में शुरुआत

, सामान के बिना

bash> cat setup-env.csh 
setenv FOO "some csh stuff" 
echo FOO=$FOO in csh 

यहाँ आदेश है : csh

से उत्पादन पर

bash> csh -c 'source setup-env.csh;exec bash' 

देखो

FOO=some csh stuff in csh 

और नई पार्टी से उत्पादन पर देखने के शैल

bash> echo $$ 
    13487 
    bash> echo $FOO 
    some csh stuff 

अब छोड़ देते हैं, और गूंज $$ प्रक्रिया को देखने के लिए मूल बैश खोल के लिए वापस जाने

bash> exit 
exit 
bash> echo $$ 
12632 
bash> 

नोट आईडी, ताकि हम देख सकें कि वे अलग-अलग खोल प्रक्रियाएं हैं।

मेरे सहकर्मी यह पर्याप्त का उपयोग करता है वह यह एक उपनाम में डालता है, जैसे:

# make csh environment scripts useable (sourceable) from bash function 
# from Phil McCoy, Wed Nov 9 2011 
source_csh() { 
    exec csh -c " source $*; setenv ALREADY_SOURCED \"$ALREADY_SOURCED:$*:\"; exec bash" 
} 
# sounds like a great idea to do source_csh .cshrc or .login 
# but naively done is infinitely recursive, 
# since the exec'ed bash will run .bashrc 

दुर्भाग्य से, मैं ने पाया है कि मैं अक्सर बस वातावरण चर सेटअप नहीं की जरूरत है, लेकिन यह भी सेटअप उपनाम, मॉड्यूल में के रूप में पैकेज http://modules.sourceforge.net/

मैं पर्ल एक्सपेक्ट का उपयोग कर इस "सीएसएस स्रोत स्क्रिप्ट व्यंजनों" को स्वचालित करने में सक्षम हूं। लेकिन उपरोक्त को छोड़कर, मैं जितना चाहूंगा उतना इंटरैक्टिव नहीं हो पाया।

+0

मैं मॉड्यूल पैकेज का एक बड़ा प्रशंसक हूं और मुझे आश्चर्य है कि अधिक लोग इसका उपयोग नहीं करते हैं। चीज़ें खोलना अज्ञात है बस करना एक अच्छी बात है। – stephenmm

0

कुछ छोटे के लिए, दो सेटअप स्क्रिप्ट बनाए रखना आम है, एक sh और sh-derived, shells, और csh और tcsh के लिए एक है। जैसा कि आप उल्लेख करते हैं, इससे सिंक से बाहर निकलने वाली दो स्क्रिप्ट का खतरा पैदा होता है - जब तक आप एक से दूसरे उत्पन्न करते हैं, या दोनों को एक सामान्य स्रोत से उत्पन्न नहीं करते हैं।

यह प्रत्येक उपयोगकर्ता के बजाय सेटअप स्क्रिप्ट के रखरखाव पर बोझ डालता है, जो उन्हें उपयोग करने की आवश्यकता है।

0

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

Source::Shell 

इसके उपयोग के लिए एक छोटे से दस्तावेज़ के माध्यम से जाएं।

संबंधित मुद्दे