2011-08-19 13 views
31

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

मैंने कोशिश की:

$ bash -lic "some_command" 

लेकिन यह नया उदाहरण के अंदर some_command निष्पादित करता है, तो यह बंद कर देता है। मैं इसे खुला रहना चाहता हूं।

एक और विवरण जो उत्तर को प्रभावित कर सकता है: यदि मैं इसे काम पर ला सकता हूं तो मैं इसे .bashrc में उपनाम (एसएस) के रूप में उपयोग करूंगा, इसलिए alias कार्यान्वयन के लिए बोनस अंक!

+0

मैं उपनाम के बारे में अंतिम भाग समझ में नहीं आता। उपनाम वर्तमान खोल के संदर्भ में निष्पादित होते हैं, इसलिए उन्हें समस्या नहीं होती है जिसे आप हल करने के लिए कह रहे हैं (हालांकि आमतौर पर, कार्य कई कारणों से उपनामों से बेहतर होते हैं)। – tripleee

+0

मैं अपने .bashrc में 'alias शॉर्टकट =' bash -lic "कुछ_command" '' जैसे कुछ डालने में सक्षम होना चाहता हूं, फिर 'शॉर्टकट' चलाएं और 'some_command' के साथ एक नया खोल पहले से ही इसमें भाग गया है। –

उत्तर

18
bash --rcfile <(echo '. ~/.bashrc; some_command') 

अस्थायी फ़ाइलों के निर्माण को वितरित करता है। अन्य साइटों पर प्रश्न:

+0

मैंने विंडोज 10 में ऐसा करने का प्रयास किया (बैच "स्टार्टअप" फ़ाइल/स्क्रिप्ट लिखने की कोशिश कर रहा है), और मुझे लगता है कि सिस्टम निर्दिष्ट फ़ाइल नहीं ढूंढ सकता है। – Scott

+1

@ स्कॉट इसे चरण-दर-चरण डीबग करें: 1) क्या बिल्ली ~/.bashrc' काम? 2) क्या 'cat <(echo a) 'काम करता है? 3) क्या 'bash --rcfile somefile' काम करता है? –

+1

@ स्कॉट हम डब्लूएसएल पर इस मुद्दे में भाग गए (स्टार्टअप बैच फ़ाइल से बैश लॉन्च करना)। हमारा समाधान कुछ पात्रों से बचने के लिए था ताकि बैच इसे समझ सके: 'bash.exe --rcfile^<^ (echo' स्रोत $ HOME/.bashrc; ls; pwd '^)' विंडोज कमांड प्रॉम्प्ट से चलाना चाहिए। – user2561747

2

आप इसे चलाने के बजाए स्क्रिप्ट को सोर्स करके इच्छित कार्यक्षमता प्राप्त कर सकते हैं। उदाहरण के लिए:

 
$cat script 
cmd1 
cmd2 
$ . script 
$ at this point cmd1 and cmd2 have been run inside this shell 
+0

हम्म। यह काम करता है, लेकिन क्या 'alias =' '' में सबकुछ एम्बेड करने का कोई तरीका नहीं है? –

+1

उपनाम का कभी भी उपयोग न करें; इसके बजाय कार्यों का उपयोग करें। आप डाल सकते हैं: 'foo() {cmd1; CMD2; } 'अपनी स्टार्ट अप स्क्रिप्ट के अंदर, और फिर foo निष्पादित करने से वर्तमान शेल में दो कमांड चलाए जाएंगे। ध्यान दें कि इनमें से कोई भी समाधान आपको एक नया खोल नहीं देता है, लेकिन आप 'exec bash' कर सकते हैं और फिर 'foo' –

+1

कभी भी न कहें। उपनामों का स्थान –

4

आप इसे अपनी पसंद का एक फ़ाइल को पढ़ने के लिए प्रेरित करने के लिए पार्टी की योजना बनाई --rcfile पारित कर सकते हैं। यह फ़ाइल आपके .bashrc के बजाय पढ़ी जाएगी।

संपादित करें (यदि यह एक समस्या है, अन्य स्क्रिप्ट से स्रोत ~/.bashrc है।): तो एक समारोह सामान के साथ एक नया खोल ~/.more.sh से शुरू करने के लिए कुछ ऐसा दिखाई देगा:

more() { bash --rcfile ~/.more.sh ; } 

... और .more.sh में आपके पास शेल शुरू होने पर निष्पादित करना चाहते हैं। (मुझे लगता है कि यह एक अलग स्टार्टअप फ़ाइल से बचने के लिए सुरुचिपूर्ण होगा - आप मानक इनपुट का उपयोग नहीं कर सकते हैं क्योंकि तब खोल इंटरैक्टिव नहीं होगा, लेकिन आप यहां एक दस्तावेज़ से एक अस्थायी स्थान में स्टार्टअप फ़ाइल बना सकते हैं, फिर इसे पढ़ें।)

27

यह एक देर का जवाब है, लेकिन मुझे एक ही समस्या थी और Google ने मुझे इस पृष्ठ पर भेजा, इसलिए यहां पूर्णता के लिए मुझे समस्या के आसपास कैसे मिला।

जहां तक ​​मैं बैश को बता सकता हूं, उसके पास मूल पोस्टर क्या करना चाहता था, करने का विकल्प नहीं है। कमांड निष्पादित किए जाने के बाद -c विकल्प हमेशा वापस आ जाएगा।

टूटी समाधान: इस के आसपास सबसे सरल और स्पष्ट प्रयास है:

bash -c 'XXXX ; bash' 

यह आंशिक रूप से (एक अतिरिक्त उप खोल परत के साथ यद्यपि) काम करता है। हालांकि, समस्या यह है कि जब एक सब-शैल निर्यातित पर्यावरण चर का उत्तराधिकारी होगा, उपनाम और कार्य विरासत में नहीं हैं। तो यह कुछ के लिए काम कर सकता है लेकिन एक सामान्य समाधान नहीं है।

बेहतर: इस के चारों ओर जिस तरह से गतिशील रूप से एक स्टार्टअप फ़ाइल बनाने और इस नए आरंभीकरण फ़ाइल के साथ बैश कहते हैं, कि अपने नियमित रूप से ~/यदि आवश्यक हो तो .bashrc अपने नए init फ़ाइल कॉल सुनिश्चित करने के लिए है।

# Create a temporary file 
TMPFILE=$(mktemp) 

# Add stuff to the temporary file 
echo "source ~/.bashrc" > $TMPFILE 
echo "<other commands>" >> $TMPFILE 
echo "rm -f $TMPFILE" >> $TMPFILE 

# Start the new bash shell 
bash --rcfile $TMPFILE 

अच्छी बात यह है कि अस्थायी init फ़ाइल, जैसे ही यह प्रयोग किया जाता है खुद को नष्ट करेगा जोखिम है कि यह सही ढंग से साफ नहीं है को कम करने के लिए है।

नोट: मुझे यकीन नहीं है कि/etc/bashrc को आमतौर पर सामान्य गैर-लॉगिन खोल के हिस्से के रूप में जाना जाता है।यदि ऐसा है तो आप स्रोत/etc/bashrc के साथ-साथ अपने ~/.bashrc को भी स्रोत बनाना चाहते हैं।

+0

'rm -f $ TMPFILE' चीज इसे बनाता है। मुझे वास्तव में उपयोग के मामले में याद नहीं है, और अब मैं अधिक उन्नत स्वचालन तकनीकों का उपयोग करता हूं, लेकिन यह रास्ता तय करने का तरीका है! –

+5

प्रक्रिया प्रतिस्थापन के साथ कोई tmp फ़ाइलें 'bash --rcfile <(echo "। ~/.bashrc; a = b") ' –

+0

तभी फ़ाइल केवल तभी साफ की जाएगी जब आपकी बैश स्क्रिप्ट सफलतापूर्वक चलती है। 'जाल' का उपयोग करने के लिए एक और मजबूत समाधान होगा। मौलिकता के लिए – tripleee

1

संलग्न ~/.bashrc को इस तरह की एक अनुभाग:

if [ "$subshell" = 'true' ] 
then 
    # commands to execute only on a subshell 
    date 
fi 
alias sub='subshell=true bash' 

तो फिर तुम sub साथ subshell शुरू कर सकते हैं।

+0

अंक। उपनाम स्वयं संभवतः 'env subshell = true bash' के रूप में बेहतर है (क्योंकि वह बाद के आदेशों में '$ subshell' को रिसाव नहीं करेगा): [env का उपयोग करके] (http://i.imgur.com/XSORn6h.png) बनाम [निर्यात का उपयोग] (http://i.imgur.com/SqwdkH8.png)। –

+0

आप सही हैं। लेकिन मैंने देखा कि यह 'env' के बिना भी काम करता है। यह जांचने के लिए कि क्या परिभाषित किया गया है या नहीं, मैं 'echo $ subshell' का उपयोग करता हूं (इसके बजाय 'env | grep subshell' जिसका उपयोग आप करते हैं)। – dashohoxha

+0

मुझे लगता है कि यह सादगी के लिए भी अंक प्राप्त करता है। – dashohoxha

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