कमांड-लाइन पर पहले से ही निश्चित पाठ के साथ एक टर्मिनल कैसे शुरू करें?


25

मेरे प्रश्न को फिर से समझने के बजाय, मुझे आपको वांछित उपयोगकर्ता-केस का वर्णन करना चाहिए:

मैं कमांड चलाने के लिए एक लघु शेल-स्क्रिप्ट बनाता हूं "gnome-terminal --someoptionflagname 'मेरे पाठ को पोस्ट किया जाना है", और इस स्क्रिप्ट को निष्पादित करें।

मेरे पाठ के बाद कमांड-लाइन प्रॉम्प्ट के साथ गनोम-टर्मिनल पॉप अप होता है।

अर्थात: fields@mycomputer:/$ my text to be posted

क्या यह किया जा सकता है?


यदि यह बग कभी भी उबंटू में तय किया जाता है तो आपको cnee में देखना चाहिए ।
ændrük

@ ændrük यह तय हो गया है और पैकेज का नाम xneeअब है।
मिठाई

जवाबों:


32

आप यह उम्मीद ( इंस्टॉल ) के साथ कर सकते हैं । निष्पादन योग्य बनाएं और बनाएं ~/bin/myprompt:

#!/usr/bin/expect -f

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send "my text to be posted"

# Hand over control to the user
interact

exit

और के साथ सूक्ति टर्मिनल चलाएं:

gnome-terminal -e ~/bin/myprompt

Expect का उपयोग करने के लिए +1। मैंने बहुत सी चीजों को स्वचालित करने में मदद करने के लिए वर्षों से इसका उपयोग किया है।
मार्को Ceppi

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

यह मुझे इतनी देर से परेशान कर रहा है, मैं लगभग याद नहीं कर सकता था कि इरादा-केस क्या था। इसलिए, स्पष्टीकरण के लिए: मैं "गनोम-टर्मिनल-एलएस" जैसा कुछ करना चाहता हूं, लेकिन यह पकड़ खिड़की के खुले रहने की है। इसलिए, मूल रूप से एक टर्मिनल खोलने और शेल कमांड चलाने के लिए शॉर्टकट। क्या यह बनाम aendruk / msw के मुद्दों को स्पष्ट करता है?
ईएमएफ

1
यदि आप चाहते हैं कि एक कमांड के बाद खुला रहना टर्मिनल है, तो बहुत सरल उपाय हैं
ændrük

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

8

अगर मैं सही तरीके से समझूं, तो आप चाहते हैं कि आपकी पहली इनपुट लाइन उन सामग्रियों के लिए पूर्वनिर्मित हो, जिन्हें आप गनोम-टर्मिनल कमांड लाइन पर पास करते हैं।

मैं नहीं जानता कि कैसे यह ठीक से मारना है, लेकिन यहाँ कुछ है जो करीब आता है। अपने में ~/.bashrc, निम्न पंक्ति को सबसे अंत में जोड़ें:

history -s "$BASH_INITIAL_COMMAND"

टेक्स्ट को वापस बुलाने के लिए प्रॉम्प्ट पर चलाएँ gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash, और दबाएँ Up

यह भी ध्यान दें कि यदि आप set -o historyटिप्पणियों के बाद अपने अंत में डालते हैं .bashrc, तो उन्हें इतिहास में दर्ज किया जाएगा जैसे ही बैश शुरू होता है, इसलिए आप उन्हें Upकुंजी के साथ पहुंचकर और प्रारंभिक को हटाकर संपादन के आधार के रूप में उपयोग कर सकते हैं #


2
हालांकि मैं इसके लिए जिस समाधान की तलाश में था, वह काफी हद तक अपने आप में दिलचस्प है।
ईएमएफ

8

mendrük का सुझाव बहुत अच्छा है और मेरे लिए काम किया, हालांकि स्क्रिप्ट के भीतर कमांड को हार्डकोड किया गया है, और यदि आप टर्मिनल विंडो का आकार बदलते हैं तो यह अच्छी तरह से काम नहीं करता है। आधार के रूप में उनके कोड का उपयोग करते हुए, मैंने myprompt स्क्रिप्ट को एक तर्क के रूप में कमांड भेजने की क्षमता जोड़ी है, और यह स्क्रिप्ट टर्मिनल विंडो के आकार को सही ढंग से संभालती है।

#!/usr/bin/expect

#trap sigwinch and pass it to the child we spawned
#this allows the gnome-terminal window to be resized
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

set arg1 [lindex $argv 0]

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send $arg1

# Hand over control to the user
interact

exit

और के साथ सूक्ति टर्मिनल चलाएं:

gnome-terminal -e "~/bin/myprompt \"my text to be posted\""

1

littlendrük का जवाब ठीक है, लेकिन शायद कार्य के लिए थोड़ा भारी है।

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

#!/bin/sh
# terminal-plus-command: start a subordinate terminal which runs
# the interactive shell after first running the command arguments

tmpscript=/tmp/tmpscript.$$
echo "#!$SHELL" > $tmpscript
echo "$@" >> $tmpscript
echo exec "$SHELL" >> $tmpscript
chmod +x $tmpscript
gnome-terminal --command $tmpscript
rm -f $tmpscript

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

चर $SHELLस्क्रिप्ट चलाने वाले शेल के नाम पर सेट है। यदि आप / usr / bin / bash का उपयोग करते हैं, तो संभवतः आप मिनी-स्क्रिप्ट को भी इसका उपयोग करना चाहेंगे।

"$@""मेरे सभी तर्कों को जोड़, उन्हें हवाले से अगर जरूरत के लिए" एक खोल मुहावरा है। यह अजीब सिंटैक्स का कारण बनता है

script.sh 'my file' your\ file

तर्कों को दो तत्वों के रूप में व्याख्यायित करना

"my file" "your file"

चार के बजाय कि $@उपज होगी

"my" "file" "your" "file"

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

अंतिम पंक्ति मिनी-स्क्रिप्ट का हिस्सा नहीं है, यह दर्शाता है कि मिनी-स्क्रिप्ट काम करती है। अगर ऊपर की 11 लाइन की स्क्रिप्ट नामक फाइल में है, rt.shतो chmodइसे निष्पादन योग्य बनाता है और फिर इसे निष्पादित किया जाता है।

$ chmod +x rt.sh && ./rt.sh echo hello world

इस सब का परिणाम एक सूक्ति टर्मिनल होगा जो शुरू होता है, प्रदर्शित करता है

hello world

अपनी पहली पंक्ति पर और फिर एक इंटरैक्टिव शेल शुरू करता है:

msw@myhost:~$

मुझे लगता है कि आपकी स्क्रिप्ट को कम किया जा सकता है gnome-terminal -x sh -c "echo hello world; bash", जो मुझे नहीं लगता कि सवाल पूछ रहा है।
ændrük

यह अच्छा लग रहा है। क्या आप बता सकते हैं कि यहां क्या हो रहा है?
ईएमएफ

1
emfields: मैंने इसे आपके लिए एनोटेट किया है।
msw

1
आपने धमाल मचाया। एनोटेशन के लिए धन्यवाद, इस तरह की मदद स्क्रिप्टिंग के साथ प्रवेश को और अधिक सुगम बनाने में मदद करती है
emf

0

जिन दो उत्तरों को मैंने हल करना पसंद किया है, वे इस का उपयोग कर रहे हैं expectऔर यह वह है जहाँ वे --init-fileध्वज का उपयोग करने की सलाह देते हैं या तो शेल्फ़ में या टर्मिनल निष्पादित करते समय:

#!/bin/bash --init-file
commands to run

... और इसे निष्पादित करें:

xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang

expect शायद बेहतर समाधान है (जिन कारणों से मैं इसकी रूपरेखा तैयार करूँगा), सिवाय इसके कि मैं यह नियंत्रित नहीं कर सकता कि यह मेरे लक्षित वातावरण में स्थापित है या नहीं।

बैश के साथ में समस्या मैं भाग गया --init-fileऔर gnome-terminal'एस --commandएक हैक के रूप में हल करने के लिए इस STDIN के लिए उपयोग नहीं है, जबकि init स्क्रिप्ट का निष्पादन खोल है। यदि, उदाहरण के लिए, मैं कुछ ऐसा चलाना चाहता हूं जिसके लिए उपयोगकर्ता इनपुट (ftp, telnet, आदि) की आवश्यकता होगी, लेकिन इसके बाद चलने वाले मूल शेल को छोड़ दें, यह काम नहीं करेगा; एकमात्र अपवाद जो मैंने अब तक देखा है वह ssh है:

xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')

... लेकिन मुझे जो चाहिए वह इस खिलौने के उदाहरण से अधिक जटिल है। वैसे भी, मुझे उम्मीद है कि --init-fileयह प्रश्न पढ़ने वाले किसी व्यक्ति के लिए उपयोगी है।


-1

आप एक नए पॉप अप टर्मिनल के अंदर कमांड चलाने के लिए -eया -xतर्कों का उपयोग कर सकते हैं , लेकिन यह वास्तव में आप क्या चाहते हैं।


बंद है, लेकिन काफी नहीं मैं क्या देख रहा हूँ। इस मामले के लिए एक समस्या यह है कि जब निष्पादित और समाप्त हो जाता है, तो टर्मिनल तुरंत बंद हो जाएगा। तो, मान लें कि मैं "ls ~ / नोट्स" का शॉर्टकट चाहता हूं, यह आउटपुट देखने से पहले बंद हो जाएगा।
ईएमएफ

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