Bashrc निष्पादित होने के बाद प्रोग्राम को सामान्य रूप से खोलें और कमांड निष्पादित करें


35

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

gnome-terminal --tab -e "कमांड" --tab --tab

कमांड को निष्पादित किया जाता है इससे पहले .bashrc को निष्पादित किया गया था। क्या एक स्वचालित सूक्ति-टर्मिनल बनाने की संभावना है-मैं एक मैन्युअल रूप से उपयोग किए जाने वाले की तरह व्यवहार करता हूं? (यहां तक ​​कि "cd / foo / bar" जैसी आज्ञाएं ग्नोम-टर्मिनल-ई के साथ काम नहीं करती हैं)

जवाबों:


45

एक बार जब गनोम-टर्मिनल ने बैश शुरू कर दिया है, तो यह लूप से बाहर है जहां तक ​​कमांड निष्पादन का संबंध है: यह केवल इनपुट और आउटपुट का प्रबंधन करता है। तो आपको ~/.bashrcलोड होने के बाद कुछ चलाने के लिए बैश के सहयोग की आवश्यकता होगी ।

सबसे पहले, कई मामलों में, आपको वास्तव में आदेशों को निष्पादित करने की आवश्यकता नहीं है ~/.bashrc। उदाहरण के लिए, किसी विशेष निर्देशिका में एक टर्मिनल खोलने के साथ बस किया जा सकता है cd /foo/bar && gnome-terminal। आप एक समान तरीके से पर्यावरण चर सेट कर सकते हैं VAR=value gnome-terminal:। (यदि आपका ~/.bashrcपर्यावरण चर चरता है, तो आप इसे गलत कर रहे हैं: पर्यावरण चर परिभाषाएँ इसमें हैं~/.profile )

टर्मिनल में कमांड निष्पादित करने के लिए, लेकिन पहले ~/.bashrc, आप कर सकते हैं

gnome-terminal -x sh -c 'command1; command2; exec bash'

यदि आप कई टैब का उपयोग करना चाहते हैं, तो आपको -eइसके बजाय उपयोग करना होगा -x। ग्नोम-टर्मिनल अनजाने में -eएक शेल के माध्यम से निष्पादित करने के बजाय रिक्त स्थान के तर्क को विभाजित करता है । फिर भी, आप एक शेल कमांड लिख सकते हैं यदि आप यह सुनिश्चित करते हैं कि इसमें रिक्त स्थान शामिल नहीं हैं। कम से कम सूक्ति-टर्मिनल 2.26 के साथ, आप टैब का उपयोग कर सकते हैं, हालाँकि ( <TAB>शाब्दिक टैब वर्ण द्वारा प्रतिस्थापित ):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

अगर आपको कमांड चलाने की जरूरत है ~/.bashrc, तो इसे कमांड को रन करें। उदाहरण के लिए, निम्नलिखित कोड को निम्नलिखित में शामिल करें ~/.bashrc:

eval "$BASH_POST_RC"

उसके बाद कुछ कोड चलाने के लिए (वास्तव में, आपके bashrc के अंत में):

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

या (उद्धरण पर कम भारी)

BASH_POST_RC='command1; command2' gnome-terminal

यद्यपि मैं विशेष रूप से इसे इस तरह से करने की सलाह नहीं देता, लेकिन आप कमांड-लाइन पर पहले से ही निश्चित पाठ के साथ एक टर्मिनल कैसे शुरू करें, इसमें वर्णित तकनीकों में रुचि हो सकती है ?


हाँ, वास्तव में एक अच्छी चाल है। ऐसा कभी नहीं सोचा था। अब मुझे विशिष्ट टैब के लिए BASH_POST_RC वैरिएबल सेट करने का एक तरीका खोजना होगा। और यह अभी भी एक समस्या है। एक साधारण "सूक्ति-टर्मिनल -tab -e 'BASH_POST_RC = ls' --tab" संभव नहीं है :-(
जरदोज़

@Zardoz: वास्तव में, आप टैब वर्णों का उपयोग करके सूक्ति-टर्मिनल को चकमा दे सकते हैं (मेरा संशोधित उत्तर देखें)। उद्धृत करने के कई स्तरों का ध्यान रखें।
गिल्स एसओ- बुराई को रोकें '

.. यह काम करता है :-) ... आपके समाधान और आपके धैर्य के लिए बहुत बहुत धन्यवाद। यहाँ मेरा पूरा कमांड (कमांड में उन रिक्त स्थान के साथ भी काम करता है: सूक्ति-टर्मिनल --working-निर्देशिका = "/ घर / जरदोज़ / प्रोजेक्ट / my_rails_app" --tab -e 'bash -c "निर्यात BASH-POST_RC = \" रेल सर्वर \ "; मार मारें" --tab -e 'bash -c "निर्यात BASH_POST_RC = \" autotest \ "; निष्पादन bash"' --tab
Zardoz

अंत में यह काम किया ... पूरे रास्ते उद्धरण के साथ कई परीक्षणों sooo के बाद। यहाँ मेरा है, zsh का उपयोग करना और एक बार में एक सर्वर और कंसोल खोलना:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
अगस्तिन रिडिंगर

1
@terdon नहीं, gnome-terminal -eएक शेल को बिल्कुल भी लागू नहीं करता है। यदि आप चलाते हैं gnome-terminal -e 'sleep 9', तो यह sleepतर्क के साथ कमांड निष्पादित करता है 9, और कोई शेल शामिल नहीं है। यदि आप निष्पादित करते हैं, gnome-terminal -e 'sleep 9;bash'तो टर्मिनल तुरंत खुलता है और तुरंत बंद हो जाता है, क्योंकि sleepशिकायत करता 9;bashहै कि वैध समय अंतराल नहीं है। आप देख सकते हैं कि क्या हो रहा हैstrace -f -eexecve gnome-terminal -e …
गिल्स एसओ- बुराई को रोकें '

6

जब आप -eविकल्प का उपयोग करते हैं तो gnome-terminalएक नया शेल शुरू किए बिना वह कमांड चलाएगा (आप कुछ ऐसा भी चला सकते हैं:) gnome-terminal -e gedit, इसलिए यदि आप bashशेल में एक कमांड को नए टर्मिनल / टैब में चलाना चाहते हैं तो आपको कुछ इस तरह करना होगा:

gnome-terminal -x bash -c "command"

लेकिन ध्यान दें कि "command"टर्मिनल / टैब कब समाप्त होगा।


1
मुझे लगता है कि आपका मतलब है gnome-terminal -x bash -c "command"( -eएक तर्क की उम्मीद है)। और commandजब तक आप एक टैब शुरू कर रहे हैं, तब तक एक शेल निष्पादित करना काफी सरल है , जब तक आप एक टैब शुरू नहीं करते हैं - मेरा उत्तर देखें ।
गिल्स एसओ- बुराई को रोकना

gnome-terminal -x "bash" -c "command"मेरे लिए काम किया। नोट -x arg मूल्य पर उद्धरण।
m3nda

मुझे # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

1
कृपया, हम क्या करते हैं -xऔर -eऑप्टोन्स पदावनत हो जाते हैं ???
nyxee

मेरा मानना ​​है कि यह ~/.bashrcकमांड निष्पादित करने से पहले नहीं चलता है , जैसा कि मूल रूप से ओपी द्वारा पूछा गया है।
IgNite
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.