เปิดโปรแกรม terminal gnome โดยทางโปรแกรมและดำเนินการคำสั่งหลังจาก bashrc ถูกใช้งาน


35

สำหรับการเริ่มต้นสภาพแวดล้อม dev ของฉันฉันเขียนสคริปต์เล็กน้อย ส่วนหนึ่งคือการเปิดเทอร์มินัลคำพังเพยที่มีหลายแท็บโดยอัตโนมัติคำสั่งบางอย่างควรจะดำเนินการ บางคำสั่งเหล่านั้นขึ้นอยู่กับ. bashrc ที่ดำเนินการแล้ว แต่เมื่อใช้งาน

gnome-terminal --tab -e "command" --tab --tab

คำสั่งจะถูกดำเนินการก่อน. bashrc ถูกดำเนินการ มีความเป็นไปได้ไหมที่จะทำให้ gnome-terminal -e อัตโนมัติทำงานเหมือนใช้งานด้วยตนเอง? (คำสั่งที่เหมือนกันเช่น "cd / foo / bar" ไม่ทำงานกับ gnome-terminal -e)

คำตอบ:


45

เมื่อ gnome-terminal เริ่ม bash แล้วมันจะออกจากลูปไปจนถึงการประมวลผลคำสั่ง: มันจะจัดการอินพุตและเอาต์พุตเท่านั้น ดังนั้นคุณต้องใช้ความร่วมมือของ bash ในการรันบางสิ่งหลังจาก~/.bashrcโหลดเสร็จแล้ว

ครั้งแรกในหลายกรณีคุณไม่จำเป็นต้องเรียกใช้คำสั่งหลังจาก~/.bashrcนั้น ตัวอย่างเช่นการเปิดเทอร์มินัลในไดเรกทอรีเฉพาะสามารถทำได้โดยcd /foo/bar && gnome-terminalง่าย คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมด้วยวิธีที่คล้ายกัน: VAR=value gnome-terminal. (หาก~/.bashrcตัวแปรสภาพแวดล้อมของคุณแทนที่คุณกำลังทำผิด: คำจำกัดความตัวแปรสภาพแวดล้อมอยู่ใน~/.profile )

เพื่อรันคำสั่งในเทอร์มินัล แต่ก่อนหน้า~/.bashrcนี้คุณสามารถทำได้

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

หากคุณต้องการที่จะใช้แท็บหลายที่คุณต้องใช้แทน-e -xGnome-terminal ช่วยแยกอาร์กิวเมนต์ของ-eat ช่องว่างโดยไม่ต้องดำเนินการผ่านเชลล์ อย่างไรก็ตามคุณสามารถเขียนคำสั่งเชลล์ได้หากคุณแน่ใจว่าจะไม่รวมช่องว่างในนั้น อย่างน้อยด้วย gnome-terminal 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 แตกต่างกันสำหรับแท็บเฉพาะ และนั่นก็ยังคงเป็นปัญหาอยู่ "gnome-terminal แบบธรรมดา --tab -e 'BASH_POST_RC = ls' --tab" เป็นไปไม่ได้ :-(
Zardoz

@Zardoz: จริง ๆ แล้วคุณสามารถหลอกลวง gnome-terminal โดยใช้อักขระแท็บ (ดูคำตอบที่แก้ไขแล้วของฉัน) คำนึงถึงข้อความหลายระดับ
Gilles

.. มันใช้งานได้ :-) ... ขอบคุณมากสำหรับการแก้ปัญหาและความอดทนของคุณ ที่นี่คำสั่งที่สมบูรณ์ของฉัน (ทำงานได้แม้กับช่องว่างเหล่านั้นในคำสั่ง: gnome-terminal --working-directory = "/ home / zardoz / โครงการ / my_rails_app" --tab -e 'bash -c "เอ็กซ์พอร์ต BASH_POST_RC = \" เซิร์ฟเวอร์ราง \ "; exec bash" '--tab -e' bash -c "export BASH_POST_RC = \" autotest \ "; exec bash" '
แท็บ

ในที่สุดก็ทำให้มันใช้งานได้ ... หลังจากทดสอบหลายอย่างด้วยเครื่องหมายคำพูดตลอดทาง นี่คือของฉันใช้ 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"'
Augustin Riedinger

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 …
Gilles

6

เมื่อคุณใช้-eตัวเลือกgnome-terminalคำสั่ง will จะรันโดยไม่ต้องเริ่มเชลล์ใหม่ (คุณสามารถเรียกใช้บางอย่างเช่นgnome-terminal -e gedit:) ดังนั้นหากคุณต้องการรันคำสั่งลงในbashเชลล์ในเทอร์มินัล / แท็บใหม่คุณต้องทำสิ่งนี้:

gnome-terminal -x bash -c "command"

แต่โปรดทราบว่าเมื่อ"command"สิ้นสุดเทอร์มินัล / แท็บก็จะสิ้นสุดเช่นกัน


1
ฉันคิดว่าคุณหมายถึงgnome-terminal -x bash -c "command"( -eคาดว่าจะมีอาร์กิวเมนต์เดียว) และมันค่อนข้างง่ายที่จะดำเนินการหลังจากที่เปลือกcommandอย่างน้อยตราบเท่าที่คุณกำลังเริ่มต้นแท็บเดียว - ดูคำตอบของฉัน
Gilles

gnome-terminal -x "bash" -c "command"ทำงานให้ฉัน เครื่องหมายคำพูดหมายเหตุเกี่ยวกับค่า -x หาเรื่อง
erm3nda

ฉันได้รับ# Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

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