ฉันจะสร้างสคริปต์ที่เปิดหน้าต่างเทอร์มินัลและดำเนินการคำสั่งได้อย่างไร


140

ฉันมีสามสคริปต์ที่ฉันจำเป็นต้องเรียกใช้เมื่อฉันเริ่มต้นเครื่อง Ubuntu ของฉันพวกเขาเริ่มบริการที่ฉันใช้ในสภาพแวดล้อมการพัฒนาของฉัน

ในการทำเช่นนั้นฉันเปิดเทอร์มินัลสามรายการด้วยตนเองและพิมพ์คำสั่ง

มีวิธีใดในการสร้างสคริปต์ที่จะเปิดเทอร์มินัลสามตัวและดำเนินการคำสั่งเดียวในแต่ละรายการ (แต่ละคำสั่งควรอยู่ในหน้าต่างเทอร์มินัลแยกต่างหากเพื่อให้ฉันเห็นผลลัพธ์)

คำตอบ:


138
gnome-terminal -e command

หรือ

xterm -e command

หรือ

konsole -e command

ค่อนข้างมาก

terminal -e command

ในการทำให้เทอร์มินัลอยู่เมื่อคำสั่งออก:

ใน konsole มี--nocloseธง

ใน xterm มี-holdแฟล็ก

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

gnome-terminal - คำสั่งเรียกหน้าต่าง - พร้อม-profile = NAMEOFTHEPROFILE -e

1
ถ้าฉันพยายามที่จะถือ terminal ฉันได้รับ "กระบวนการเด็กออกตามปกติด้วยรหัสสถานะ 127"
Darshan Chaudhary

2
gnome-terminal ไม่มีตัวเลือกชื่ออีกต่อไป :(
törzsmókus

1
@ törzsmókusมันคือ 2017 แน่นอน! รุ่น LTS มีอายุการใช้งาน 5 ปี 14.04 ไม่สิ้นสุดจนถึงเมษายน 2019 wiki.ubuntu.com/Releases
bhass1

1
gnome-terminal -e commandใช้งานได้commandก็ต่อเมื่อมีการเสนอราคา ดังนั้นนี้ไม่ได้ทำงาน: แต่ตอนนี้ไม่:gnome-terminal -e "echo hello world; sleep 3" gnome-terminal -e "bash -c 'echo hello world; sleep 3'"ถอนหายใจ
bgoodr

3
นอกจากนี้คุณยังสามารถเปิด gnome-terminal ค้างไว้โดยการเพิ่ม; $SHELLไปยังจุดสิ้นสุดของคำสั่ง Ex:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
กาเบรียลสเตเปิล

58

แทนฮาร์ดโค้ดgnome-terminal, konsoleฯลฯ , ใช้ระบบทางเลือก โปรแกรมที่ดำเนินการเทอร์มินัลอีมูเลเตอร์เริ่มต้นคือ:

x-terminal-emulator

ในระบบของฉันมันจะเปิดอินสแตนซ์ใหม่ของ Konsole ทุกครั้งที่ฉันเรียกใช้คำสั่งนี้

โชคดีที่เทอร์มินัลดูเหมือนว่าจะสนับสนุน-eตัวเลือกสำหรับการดำเนินการคำสั่ง (ฉันตรวจสอบมันสำหรับkonsoleและgnome-terminal) อาร์กิวเมนต์หลังจากคำสั่งถูกส่งผ่านไปยังคำสั่งที่เรียกใช้ ทุบตีปฏิเสธที่จะเปิดให้บริการในเทอร์มินัลของฉันต้องการสคริปต์เพิ่มเติมเพื่อรับเทอร์มินัล:

#!/bin/sh
"$@"
exec "$SHELL"

หากคุณบันทึกสคริปต์ก่อนหน้าเป็น/home/user/hackyและทำให้สามารถเรียกใช้งานได้คุณจะเรียกใช้สคริปต์ด้วย:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

ต้องใช้พา ธ เต็มและ/home/user/hackyต้องสามารถเรียกใช้งานได้

ความพยายามที่ผ่านมาของฉันที่จะเรียกใช้สคริปต์ในหน้าต่าง terminal ใหม่สามารถพบได้ในการแก้ไข # 2x-terminal-emulatorมันก็ก่อนที่ผมจะตระหนักถึงข้อโต้แย้งที่สามารถส่งผ่านไป


ในกรณีนี้มันจะไม่ช่วยได้มากนักเนื่องจากผู้ถามต้องการทำสิ่งที่ไม่เหมือนกันสำหรับเทอร์มินัลทั้งหมด
nickguletskii

ลอง # 3: อันนี้ควรเปิด terminal และรันโปรแกรมด้วยอาร์กิวเมนต์ที่เป็นตัวเลือก
Lekensteyn

1
ฉันใช้ตัวเลือกคำพังเพยอย่างไรก็ตามเมื่อฉันเรียกใช้สคริปต์แล้วเทอร์มินัลหลักจะปิดลง !! .. ความคิดใด ๆ
McLan

3
@ Suda.nese นั่นคือจากการออกแบบเมื่อ "terminal" เสร็จสิ้นการดำเนินการสคริปต์มันจะออกเพราะไม่มีอะไรให้ทำอีกต่อไป คุณสามารถ "แก้ไข" นี้โดยเรียกเปลือกที่คุณสามารถรันคำสั่ง (กbash) read -p "Press Return to continue"หรือมีสายเช่น
Lekensteyn

1
คุณจะรันคำสั่งมากกว่าหนึ่งคำสั่งในเทอร์มินัลได้อย่างไร cd xxx && start.shเช่น ผู้ตีความเห็นว่า && เป็นส่วนที่สองของคำสั่ง (ซึ่งเป็นตรรกะ) แต่ถ้าฉันพูดถึงมันก็จะพยายามดำเนินการทั้งหมดเป็นข้อโต้แย้งที่ยิ่งใหญ่
Richard

9

ค่อนข้างง่าย -

#!/bin/bash

/etc/init.d/ccpd status

นี่เพียงพอสำหรับคำสั่งอื่น ๆ ที่ไม่ต้องการแสดงอะไรในเทอร์มินัล แต่ที่นี่เราต้องเห็นสถานะที่แสดง
ดังนั้นจึงจำเป็นต้องทำงานในหน้าต่างเทอร์มินัล

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

โพสต์อื่น ๆ ที่ตั้งใจ[]จะเป็นตัวแทน

ที่นี่ "NAMEOFTHEPROFILE" จะถูกแทนที่ด้วยชื่อของโปรไฟล์ที่ "ถือเทอร์มินัลเมื่อคำสั่งออก"

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


1
@cipricus ฉันเชื่อว่า[]เป็นเพียงตัวยึดตำแหน่ง
Karthik T

เข้าใจแล้ว. แต่ฉันต้องทำให้เครื่องไม่ปิดเร็วมาก ฉันเดาว่ายังอยู่ในคำถามที่เชื่อมโยง

@cipricus คุณลองใช้โปรไฟล์แล้วหรือยัง เพียงแค่ต้องเพิ่ม--window-with-profile=NAMEOFTHEPROFILEสิ่งที่ฉันได้รับ
Karthik T

1
@cipricus ฉันจะต้องกลับบ้านเพื่อให้คำแนะนำที่ดีขึ้น แต่ความคิดคือการสร้างโปรไฟล์พิเศษด้วยชุดตัวเลือกนั้นและใช้ชื่อของโปรไฟล์พิเศษในสถานที่ข้างต้น
Karthik T

2
@cipricus ถ้านั่นเพียงพอสำหรับคุณนั่นก็โอเค โปรไฟล์ไม่มีอะไรมากไปกว่าการตั้งค่ากลุ่ม คุณสามารถตั้งค่าการตั้งค่าสำหรับใช้ในสคริปต์ของคุณเท่านั้นและไม่จำเป็นต้องใช้ในเทอร์มินัลทั้งหมด คุณสามารถดูแก้ไข -> โปรไฟล์เพื่อดูโปรไฟล์ทั้งหมดที่คุณมีและคุณจะเพิ่มโปรไฟล์ที่มีการตั้งค่าตามที่อธิบายในโพสต์ที่คุณเชื่อมโยง
Karthik T

5

รับความช่วยเหลือจากคำตอบของ @ nickguletskii , และแสดงความคิดเห็นของตัวเองภายใต้คำตอบของเขาและแรงบันดาลใจจาก upvote @ grabantot ของความคิดเห็นของฉันที่นี่เป็นวิธีที่ต้องการของฉันจะทำมันโดยเฉพาะอย่างยิ่งเมื่อฉันต้องการ terminal เพื่อเปิดอยู่ดังนั้นฉันสามารถแล้วด้วยตนเองใช้มัน

อดีต การใช้งาน: สิ่งนี้มีประโยชน์มากในการเพิ่มโปรแกรมเริ่มต้นของคุณดังนั้นสคริปต์นี้จะทำงานเปิดเทอร์มินัลสร้างและตั้งชื่อแท็บในเทอร์มินัลและเรียกใช้คำสั่งสำหรับคุณ หรือคุณสามารถเพิ่ม symlink ให้กับสคริปต์นี้ในเดสก์ท็อปของคุณ ฉันใช้วิธีการแบบนี้เพื่อให้ฉันสามารถดับเบิลคลิกที่ไอคอนเดียวบนเดสก์ท็อปของฉันและเปิดมันขึ้นมาเป็นเทอร์มินัล (โดยมีแท็บต่างๆตั้งชื่อตามงานที่ฉันจะทำ) สภาพแวดล้อมการเขียนโปรแกรมของฉันเช่นสำหรับงานประจำวัน

นี่เป็นตัวอย่างที่วางแผนไว้ซึ่งเปิดแท็บเดียวชื่อมันว่า "ทดสอบ" จากนั้นรันคำสั่งง่ายๆcd /etc; lsภายในนั้น $SHELLส่วนหนึ่งในตอนท้ายบังคับเปลือกที่จะเข้าพักเปิดเพื่อให้คุณสามารถเห็นผลลัพธ์ของมันและยังคงใช้มัน (ผมได้เรียนรู้ที่ไหนสักแห่งอื่นในกองมากเกิน):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

นี่คือตัวอย่างที่ซับซ้อนมากขึ้นซึ่งเปิดขึ้น 3 แท็บแยกกันใน gnome-terminal เดียวกัน นี่คือประเภทของสิ่งที่ทางลัดบนเดสก์ท็อปของฉันทำดังนั้นฉันจึงสามารถเปิดหน้าต่างการเขียนโปรแกรมได้หลายรายการพร้อมกัน:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

นี่คือรายละเอียดของคำสั่งดังกล่าวข้างต้น:

  • gnome-terminal = เปิดสถานี gnome-terminal
  • --tab = เปิดแท็บที่ไม่ซ้ำสำหรับสิ่งที่เกิดขึ้นต่อไป
  • --title="tab 1" = ชื่อแท็บนี้ "แท็บ 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= เรียกใช้bash -c 'cd /etc; ls; $SHELL'คำสั่งซึ่งเป็นคำสั่งที่ฉันเพิ่งสร้างขึ้นเป็นตัวอย่าง; นี่คือสิ่งที่มันทำ:
    • bash -c บอกว่ามันเป็นทุบตี 'c'ommand
    • cd /etc = 'c'hange' d'irectory เข้าสู่เส้นทาง "/ etc"
    • ls = 'l'i' เนื้อหาของไดเรกทอรีนี้
    • $SHELL= ชิ้นอาหารอันโอชะลึกลับนี้จะต้องเปิดเปลือกเพื่อให้คุณสามารถทำงานกับมัน หากคุณต้องการให้เชลล์เปิดให้รันคำสั่งของคุณแล้วปิดเพียงแค่เอาส่วนนี้ออก อย่างไรก็ตามฉันต้องการให้แท็บเปิดอยู่เพื่อที่ฉันจะสามารถสร้างเวทย์มนตร์การเขียนโปรแกรมได้ :)
  • จากนั้นเราจะเริ่มต้นใหม่ที่--tabส่วนเพื่อสร้างแท็บ 2 จากนั้นอีกครั้งสำหรับแท็บ 3 ปรับแต่งตามเนื้อหาของหัวใจ

ภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่


1
ดีใจที่ฉันเป็นประโยชน์) ฉันยังมีสคริปต์ที่ฉันสามารถคลิกและเริ่มทำงานในโครงการ มีปัญหาสองประการคือหน้าต่างเทอร์มินัลมากมาย (มีหน้าจอแยกต่างหากสำหรับพวกเขา) และหน้าต่างปิดหลังจากเซิร์ฟเวอร์ล่มตัวอย่างเช่น คำตอบนั้นแก้ปัญหาของฉันทั้งสองด้วย --tab + $ SHELL ดี
grabantot

1

แสดงความคิดเห็นสำหรับคำตอบโดย Lekensteyn ฉันรู้ว่านี่เป็นโพสต์เก่า แต่สำหรับทุกคนที่พบว่ามีประโยชน์ (เหมือนที่ฉันเพิ่งทำ) แทนที่จะสร้าง "hacky script" อีกครั้งโดยใส่ฟังก์ชั่นในสคริปต์ที่คุณโทรหา

hacky_function()
{
"$@"
exec "$SHELL"
}

เรียกสคริปต์ของคุณด้วย "x-terminal-emulator -e / path / to / script อาร์กิวเมนต์ที่เป็นตัวเลือก hacky_function ที่นี่"

อย่าลืมใส่ "$ @" ไว้ท้ายสคริปต์


-2

ใช้คำสั่งหน้าจอและ -d แยกออกจากเซสชั่นหน้าจอที่มีอยู่และใส่กลับเข้าไปที่นี่ -M บังคับเซสชั่นหน้าจอใหม่ -S สร้างชื่อเซสชั่นแทนการใช้ชื่อเริ่มต้น


คำตอบนี้ไม่ชัดเจนเลยโปรดทำความเข้าใจให้มากขึ้น
azerafati

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