วิธีการเริ่มต้นเทอร์มินัลที่มีข้อความบางอย่างอยู่แล้วในบรรทัดคำสั่ง


25

แทนที่จะใช้คำถามใหม่อีกครั้งขอให้ฉันอธิบายถึงกรณีผู้ใช้ที่คุณต้องการ:

ฉันสร้างเชลล์สคริปต์สั้น ๆ เพื่อเรียกใช้คำสั่ง "gnome-terminal --someoptionflagname 'ข้อความของฉันที่จะโพสต์'" และดำเนินการสคริปต์นี้

Gnome-terminal ปรากฏขึ้นพร้อมกับบรรทัดคำสั่งตามด้วยข้อความของฉัน

เช่น: 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 ด้วย:

gnome-terminal -e ~/bin/myprompt

+1 สำหรับการใช้งานคาดหวัง ฉันใช้สิ่งนี้มาหลายปีเพื่อช่วยเหลือหลายสิ่งโดยอัตโนมัติ
Marco Ceppi

ที่นี่หนาว. ฉันหวังว่าจะมีคำตอบง่ายๆ (ish) ตามการใช้งาน gnome-terminal ที่เป็นค่าเริ่มต้น แต่ดูเหมือนว่านี่จะเป็นคำตอบของงาน
emf

อันนี้ฉันมานานแล้วฉันแทบจำไม่ได้ว่ากรณีการใช้งานที่ตั้งใจไว้คืออะไร ดังนั้นเพื่อความกระจ่าง: ฉันต้องการทำอะไรบางอย่างเช่น "gnome-terminal -e ls" แต่การจับคือการให้หน้าต่างเปิดอยู่ ดังนั้นโดยทั่วไปทางลัดเพื่อเปิดเทอร์มินัลและเรียกใช้คำสั่งเชลล์ สิ่งนี้จะอธิบายปัญหาให้กับคำตอบของ aendruk / msw หรือไม่?
emf

1
หากสิ่งที่คุณต้องการคือเทอร์มินัลที่ยังคงเปิดอยู่หลังจากคำสั่งมีโซลูชั่นที่ง่ายกว่ามาก
ændrük

สุดยอดขอบคุณ ฉันได้รวมสิ่งนี้เข้ากับเชลล์สคริปที่เรียกเครื่องมือการรวมข้อมูลของ Pentaho จากนั้นฉันได้เพิ่มการเรียกใช้สคริปต์นี้ในตัวเรียกใช้งาน Unity ใน 11.10 และใช้งานได้อย่างมีเสน่ห์
bioShark

8

หากฉันเข้าใจถูกต้องคุณต้องการให้บรรทัดอินพุตแรกของคุณถูกเติมล่วงหน้าให้กับเนื้อหาที่คุณส่งผ่านบรรทัดคำสั่ง gnome-terminal

ฉันไม่รู้ว่าจะทำสิ่งนี้ได้อย่างไรด้วยการทุบตี แต่นี่เป็นสิ่งที่ใกล้เคียง ในของคุณ~/.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
แม้ว่าจะไม่ใช่วิธีการแก้ปัญหาที่ฉันกำลังมองหา แต่สิ่งนี้น่าสนใจในสิทธิของตนเอง
emf

8

ข้อเสนอแนะของændrükนั้นดีมากและทำงานได้ดีสำหรับฉันอย่างไรก็ตามคำสั่งนั้น hardcoded ภายในสคริปต์และถ้าคุณปรับขนาดหน้าต่างเทอร์มินัลมันก็ใช้งานไม่ได้ การใช้รหัสของเขาเป็นฐานฉันได้เพิ่มความสามารถในการส่งสคริปต์คำสั่ง 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 ด้วย:

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

1

คำตอบของændrü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

หากคุณไม่ได้ทำการเขียนโปรแกรมเชลล์มากนักดูเหมือนว่าจะมีเวทย์มนตร์มากกว่าที่เคยเป็น อันดับแรกฉันตั้งชื่อไฟล์ชั่วคราวสำหรับเก็บสคริปต์โดยที่$$ID กระบวนการของเชลล์ใช้งานสคริปต์นี้ /tmp/something.$$อุปมาถูกนำมาใช้ในกรณีที่สองกรณีของสคริปต์นี้จะดำเนินการในเวลาเดียวกันพวกเขาจะไม่พยายามที่จะใช้แฟ้มชั่วคราวเดียวกัน

ตัวแปร$SHELLถูกตั้งค่าเป็นชื่อของเชลล์ที่รันสคริปต์ หากคุณใช้ / usr / bin / bash สมมุติว่าคุณต้องการให้มินิสคริปต์ใช้งาน

"$@"เป็นสำนวนเปลือกสำหรับ "สอดแทรกข้อโต้แย้งของฉันทั้งหมดอ้างพวกเขาหากจำเป็น" ไวยากรณ์ผิดปกตินี้ทำให้เกิด

script.sh 'my file' your\ file

เพื่อแก้ไขข้อโต้แย้งเป็นสององค์ประกอบ

"my file" "your file"

แทนที่จะเป็นสี่ที่$@จะให้ผล

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

บรรทัดสุดท้ายของสคริปต์จะจัดให้มี gnome-terminal เพื่อเริ่มใช้งาน mini-script จากนั้นเริ่มต้นเชลล์แบบโต้ตอบ เมื่อออกจากเทอร์มินอล gnome สคริปต์ชั่วคราวจะถูกลบออกเพราะการทิ้งขยะไม่ได้เป็นการกระทำ

บรรทัดสุดท้ายไม่ได้เป็นส่วนหนึ่งของ mini-script มันแสดงให้เห็นว่า mini-script ทำงานได้ ถ้าสคริปต์ 11 บรรทัดข้างต้นอยู่ในไฟล์ที่เรียกว่าrt.shแล้วchmodทำให้มันปฏิบัติการและจากนั้นก็จะถูกดำเนินการ

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

ผลลัพธ์ทั้งหมดนี้จะเป็นเทอร์มินอล gnome ที่เริ่มต้นขึ้น

hello world

ในบรรทัดแรกและจากนั้นเริ่มเปลือกโต้ตอบ:

msw@myhost:~$

ฉันคิดว่าสคริปต์ของคุณอาจลดลงไปgnome-terminal -x sh -c "echo hello world; bash"ซึ่งฉันไม่คิดว่าคำถามจะถาม
ændrük

มันดูเท่ห์ คุณช่วยอธิบายสิ่งที่เกิดขึ้นที่นี่ได้ไหม
emf

1
emfields: ฉันอธิบายให้คุณ
msw

1
คุณร็อค ขอบคุณสำหรับคำอธิบายประกอบความช่วยเหลือแบบนี้ทำให้การเข้าถึงสคริปต์ทำได้ยากขึ้น
emf

0

ทั้งสองคำตอบที่ผมชอบดีที่สุดในการแก้ปัญหานี้มีการใช้expectและการอย่างใดอย่างหนึ่งที่พวกเขาแนะนำให้ใช้--init-fileธงทั้งใน shebang หรือเมื่อมีการดำเนินขั้ว:

#!/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's --commandเป็นสับเพื่อแก้ปัญหานี้คือเปลือกไม่ได้เข้าสู่ STDIN ขณะที่รันสคริปต์ init ตัวอย่างเช่นถ้าฉันต้องการเรียกใช้บางสิ่งที่ต้องการอินพุตผู้ใช้ (ftp, telnet ฯลฯ ) แต่ปล่อยให้เชลล์พาเรนต์ทำงานหลังจากนั้นจะไม่ทำงาน ข้อยกเว้นเดียวที่ฉันเคยเห็นในตอนนี้คือ ssh:

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

... แต่สิ่งที่ฉันต้องการนั้นซับซ้อนกว่าตัวอย่างของเล่นนี้ อย่างไรก็ตามฉันหวังว่าทุก--init-fileอย่างจะเป็นประโยชน์สำหรับทุกคนที่อ่านคำถามนี้


-1

คุณสามารถใช้-eหรือ-xอาร์กิวเมนต์เพื่อเรียกใช้คำสั่งภายในเทอร์มินัลที่เพิ่งเปิดใหม่ แต่นั่นไม่ใช่สิ่งที่คุณต้องการ


ปิด แต่ไม่มากสิ่งที่ฉันกำลังมองหา ปัญหาหนึ่งสำหรับกรณีนี้คือเมื่อดำเนินการและเสร็จสิ้นเครื่องจะปิดทันที ดังนั้นสมมติว่าฉันต้องการทางลัดไปที่ "ls ~ / notes" มันจะปิดก่อนที่ฉันจะสามารถดูผลลัพธ์ได้
emf

หากมีวิธีแก้ปัญหานี้ก็จะแก้ปัญหาส่วนใหญ่ที่ฉันกำลังมองหา
emf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.