सवाल प्रारंभिक आदेशों के साथ तुरंत ("सुपर") खोल पर वापस लौटने के बिना एक इंटरैक्टिव बैश सबहेल चलाएं


मैं एक बैश सबहेल चलाने के लिए चाहता हूं, (1) कुछ कमांड चलाएं, (2) और फिर कृपया उस सबशेल में रहें जैसा मैं चाहता हूं। मैं इनमें से प्रत्येक को अलग-अलग कर सकता हूं:

  1. का उपयोग कर रन कमांड -c झंडा:

    $> bash -c "ls; pwd; <other commands...>"
    

    हालांकि, आदेशों को निष्पादित करने के बाद यह तुरंत "सुपर" खोल पर वापस आ जाता है। मैं सिर्फ एक इंटरैक्टिव सबहेल चला सकता हूं:

  2. नई शुरुआत bash प्रक्रिया:

    $> bash
    

    और जब तक मैं स्पष्ट रूप से नहीं कहता तब तक यह सबहेल से बाहर नहीं निकलेगा ... लेकिन मैं कोई प्रारंभिक आदेश नहीं चला सकता। मैंने पाया सबसे नज़दीकी समाधान है:

    $> bash -c "ls; pwd; <other commands>; exec bash"
    

    जो काम करता है, लेकिन जिस तरह से मैं चाहता था, क्योंकि यह एक सबहेल में दिए गए आदेश चलाता है, और फिर बातचीत के लिए एक अलग खोलता है।

मैं इसे एक लाइन पर करना चाहता हूं। एक बार जब मैं सबहेल से बाहर निकल जाता हूं, तो मुझे घटना के बिना नियमित "सुपर" खोल पर वापस जाना चाहिए। एक रास्ता होना चाहिए ~~

एनबी: मैं क्या नहीं पूछ रहा हूं ...

  1. यह नहीं पूछना कि बैश मैन पेज को पकड़ना कहाँ है
  2. फ़ाइल से कमांड को प्रारंभ करने के तरीके से नहीं पूछना ... मुझे पता है कि यह कैसे करना है, यह वह समाधान नहीं है जिसे मैं ढूंढ रहा हूं
  3. tmux या gnu स्क्रीन का उपयोग करने में रुचि नहीं है
  4. इस पर संदर्भ देने में दिलचस्पी नहीं है। यानी, सवाल सामान्य होना है, न कि किसी विशेष उद्देश्य के लिए
  5. यदि संभव हो, तो मैं कामकाज का उपयोग करना टालना चाहता हूं जो कि मैं चाहता हूं कि पूरा करने के लिए, लेकिन "गंदे" तरीके से। मैं बस इसे एक लाइन पर करना चाहता हूं। विशेष रूप से, मैं कुछ ऐसा नहीं करना चाहता हूं xterm -e 'ls'

62
2018-03-09 15:12


मूल


मैं एक उम्मीद समाधान की कल्पना कर सकता हूं, लेकिन यह शायद ही एक लाइनर है जिसे आप चाहते हैं। किस तरह से है exec bash समाधान आपके लिए अनुपयुक्त है? - glenn jackman
@glennjackman क्षमा करें, मैं शब्दकोष से परिचित नहीं हूँ। "समाधान समाधान" क्या है? यह भी exec bash समाधान में दो अलग-अलग सबशेल्स शामिल हैं। मुझे एक निरंतर सबहेल चाहिए। - SABBATINI Luca
की सुंदरता exec क्या यही है बदल देता है दूसरे के साथ पहला सबहेल, इसलिए आप केवल माता-पिता के नीचे 1 खोल छोड़ चुके हैं। यदि आपके प्रारंभिक आदेश कमांड वाले चर सेट करते हैं, तो वे exec'ed shell में मौजूद होंगे। - glenn jackman
वही संभव है stackoverflow.com/questions/7120426/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
और समस्या के साथ exec यह है कि आप कुछ भी खो देते हैं जो पर्यावरण के माध्यम से सबहेल तक नहीं पारित किया जाता है, जैसे गैर-निर्यातित चर, कार्य, उपनाम, ... - Curt J. Sampson


जवाब:


यह आसानी से किया जा सकता है अस्थायी नामित पाइप:

bash --init-file <(echo "ls; pwd")

इस उत्तर के लिए क्रेडिट टिप्पणी के लिए जाता है ली रयान। मैंने यह वास्तव में उपयोगी पाया, और टिप्पणियों में यह कम ध्यान देने योग्य है, इसलिए मैंने सोचा कि यह अपना उत्तर होना चाहिए।


59
2018-04-02 20:17



इसका अनुमान है कि $HOME/.bashrc हालांकि निष्पादित नहीं किया गया है। इसे अस्थायी नामित पाइप से शामिल किया जाना होगा। - Hubro
स्पष्टीकरण के लिए, इस तरह कुछ: bash --init-file <(echo ". \"$HOME/.bashrc\"; ls; pwd") - Hubro
यह बहुत सकल है लेकिन यह काम करता है। मुझे विश्वास नहीं है कि बैश सीधे इसका समर्थन नहीं करता है। - Pat Niemeyer
@ हूब्रो, इसका उद्देश्य क्या है .  आदेश में? इसके बिना, मुझे अपने "अनुमति अस्वीकार" मिलती है .bashrc, लेकिन मुझे समझ में नहीं आता क्यों, और कैसे . इसे ठीक करता है - Gus
@ गुस, द . के लिए एक पर्याय है source आदेश: ss64.com/bash/source.html। - Jonathan Potter


आप इसे एक temp फ़ाइल के साथ एक चौराहे के रास्ते में कर सकते हैं, हालांकि इसमें दो पंक्तियां होंगी:

echo "ls; pwd" > initfile
bash --init-file initfile

9
2018-03-09 16:21



एक अच्छे प्रभाव के लिए आप अस्थायी फ़ाइल को शामिल करके स्वयं को हटा सकते हैं rm $BASH_SOURCE इस में। - Eduardo Ivanec
एडवार्डो, धन्यवाद। यह एक अच्छा समाधान है, लेकिन ... क्या आप कह रहे हैं कि यह नहीं किया जा सकता है के बिना फ़ाइल I / O के साथ बेवकूफ होना है। स्पष्ट कारण हैं कि मैं इसे स्वयं निहित कमांड के रूप में क्यों रखना पसंद करूंगा, क्योंकि पल फाइलें मिश्रण में आती हैं, मुझे यादृच्छिक अस्थायी फ़ाइलों को बनाने के बारे में चिंता करना शुरू करना होगा और फिर, जैसा कि आपने उल्लेख किया है, उन्हें हटा देना। अगर मैं कठोर होना चाहता हूं तो इसे इस तरह से और अधिक प्रयास की आवश्यकता है। इसलिए एक अधिक सरल, सुरुचिपूर्ण समाधान की इच्छा। - SABBATINI Luca
@SABBATINILuca: मैं ऐसा कुछ नहीं कह रहा हूं। यह सिर्फ एक रास्ता है, और mktemp temp फ़ाइल समस्या को @cjc के रूप में इंगित करता है। दे घुमा के सकता है stdin से init कमांड पढ़ने का समर्थन करते हैं, लेकिन जहां तक ​​मैं इसे बता सकता हूं। Specyfing - इनिट फ़ाइल के रूप में और उन्हें आधे कामों को पाइप करना, लेकिन बैश फिर निकलता है (शायद क्योंकि यह पाइपलाइन का पता लगाया गया है)। सुरुचिपूर्ण समाधान, आईएमएचओ, निष्पादन का उपयोग करना है। - Eduardo Ivanec
क्या यह आपके सामान्य बैश प्रारंभिकरण को भी ओवरराइड नहीं करता है? @SABBATINILuca आप इसके साथ क्या हासिल करने की कोशिश कर रहे हैं, आपको कुछ शेल ऑटो चलाने के लिए कुछ आदेशों को चलाने की आवश्यकता क्यों है और फिर उस खोल को खोलें? - Iain
यह एक पुराना सवाल है, लेकिन बैश निम्नलिखित वाक्यविन्यास का उपयोग करके अस्थायी नामित पाइप बना सकता है: bash --init-file <(echo "ls; pwd")। - Lie Ryan


इसके बजाए इसे आजमाएं:

$> bash -c "ls;pwd;other commands;$SHELL"

$SHELL  यह खोल को इंटरैक्टिव मोड में खोलता है, जिसके साथ निकटता की प्रतीक्षा होती है exit


4
2018-02-23 03:50



एफवाईआई, यह बाद में एक नया खोल खोलता है, इसलिए यदि कोई भी आदेश वर्तमान खोल के राज्य को प्रभावित करता है (उदाहरण के लिए फ़ाइल को सोर्स करना) तो यह उम्मीद के अनुसार काम नहीं कर सकता है - ThiefMaster


"समाधान समाधान" का जिक्र कर रहा था जिसमें मैं एक बैश खोल प्रोग्रामिंग कर रहा था प्रोग्रामिंग भाषा की अपेक्षा करें:

#!/usr/bin/env expect
set init_commands [lindex $argv 0]
set bash_prompt {\$ $}              ;# adjust to suit your own prompt
spawn bash
expect -re $bash_prompt {send -- "$init_commands\r"}
interact
puts "exiting subshell"

आप इसे पसंद करेंगे: ./subshell.exp "ls; pwd"


2
2018-03-09 19:56



मुझे लगता है कि इतिहास में कमांड को पंजीकृत करने का लाभ भी होगा, क्या मैं गलत हूं? अगर मैं इस मामले में bashrc / प्रोफाइल निष्पादित किया गया है तो भी मुझे उत्सुकता है? - muhuk
पुष्टि की है कि यह आपको इतिहास में आदेश देने की अनुमति देता है, जो अन्य समाधान नहीं करते हैं। यह एक .screenrc फ़ाइल में प्रक्रिया शुरू करने के लिए बहुत अच्छा है - यदि आप प्रारंभ प्रक्रिया से बाहर निकलते हैं, तो आप स्क्रीन विंडो बंद नहीं करते हैं। - Dan Sandberg


अगर sudo -E bash काम नहीं करता है, मैं निम्नलिखित का उपयोग करता हूं, जो अब तक मेरी अपेक्षाओं को पूरा कर चुका है:

sudo HOME=$HOME bash --rcfile $HOME/.bashrc

मैंने HOME = $ HOME सेट किया है क्योंकि मैं चाहता हूं कि मेरा नया सत्र होम के बजाय होम के बजाय मेरे उपयोगकर्ता के घर पर सेट हो, जो कि कुछ सिस्टम पर डिफ़ॉल्ट रूप से होता है।


1
2017-09-16 15:07





से कम सुरुचिपूर्ण --init-file, लेकिन शायद अधिक साधन योग्य:

fn(){
    echo 'hello from exported function'
}

while read -a commands
do
    eval ${commands[@]}
done

0
2018-04-17 01:37





देशी सबहेल्स का उपयोग क्यों नहीं करें?

$ ( ls; pwd; exec $BASH; )
bar     foo     howdy
/tmp/hello/
bash-4.4$ 
bash-4.4$ exit
$

कोष्ठक के साथ आदेशों को बंद करने से इन आदेशों को चलाने के लिए एक उपप्रोसेस को बाश स्पॉन बनाता है, उदाहरण के लिए, आप पैरेंट शैल को प्रभावित किए बिना पर्यावरण को बदल सकते हैं। यह मूल रूप से अधिक पढ़ने योग्य समकक्ष है bash -c "ls; pwd; exec $BASH"

यदि वह अभी भी वर्बोज़ दिखता है, तो दो विकल्प हैं। एक इस स्निपेट को एक समारोह के रूप में रखना है:

$ run() { ( eval "$@"; exec $BASH; ) }
$ run 'ls; pwd;'
bar     foo     howdy
/tmp/hello/
bash-4.4$ exit
$ run 'ls;' 'pwd;'
bar     foo     howdy
/tmp/hello/
bash-4.4$ exit
$

एक और बनाना है exec $BASH कम:

$ R() { exec $BASH; }
$ ( ls; pwd; R )
bar     foo     howdy
/tmp/hello/
bash-4.4$ exit
$

मुझे व्यक्तिगत रूप से पसंद है R अधिक दृष्टिकोण, क्योंकि तारों से बचने के साथ खेलने की कोई जरूरत नहीं है।


0
2017-08-14 21:51