Bash

在終端中執行命令,然後讓我輸入更多命令

  • October 6, 2015

我編寫了這個腳本來在同一個終端視窗中創建多個選項卡並在其中執行命令:

#!/bin/bash
#Use the commands as:
#--tab-with-profile=Default --title=<SPECIFY THE TAB TITLE HERE> -e "bash -ic \"<SPECIFY THE COMMAND YOU WANT TO RUN HERE>; bash\"" \
#The ampersand in the end of this file makes sure that the gnome-terminal command is run as a background process

echo "Setting up simulator environment";
service mysqld start;

gnome-terminal \
 --tab-with-profile=Default --title=PROG1 -e "bash -ic \"clear;ls;./prog1; bash disown\"" \
 --tab-with-profile=Default --title=SIMULATOR -e "bash -ic \"clear;ls;./simulator; bash disown\"" \
 --tab-with-profile=Default --title=PROG2 -e "bash -ic \"clear;ls;./prog2; bash disown\"" \
 --tab-with-profile=Default --title=DATA -e "bash -ic \"./data -f \"/home/user/NetBeansProjects/data3.txt\" -p \"6785\"; bash disown\"" \
 --tab-with-profile=Default --title=PROG3 -e "bash -ic \"cd /home/user/NetBeansProjects/simulator;./prog3; bash disown\"" \
&

問題是,當這些程序中的任何一個完成執行時,或者如果我按下Ctrl+c停止這些程序中的任何一個,選項卡就會關閉。我不希望標籤關閉。我希望選項卡保持打開狀態並顯示 bash 終端,以便我可以在選項卡中執行其他命令。有沒有辦法做到這一點?

有兩個問題;

第一個是在每個bash -ic命令內部(順便說一下,它不會產生互動式外殼,因為-c覆蓋-i,所以-i它被刪除是安全的)你正在呼叫bash disown而不是bash,這意味著什麼都沒有,並且在出錯時立即退出;所以沒有互動式shell繼續執行,在外部命令gnome-terminal結束時保持打開;bash -c

(還請注意,您可以使用exec bash而不是bash在命令末尾來保存一些程序。)

第二個是Ctrl+ CSIGINTs 對同一組被殺死程序中的所有程序,包括bash應該在命令末尾生成互動式 shell 的父實例;

要解決此問題,您可以使用bashtrap內置設置在接收到 SIGINT 信號時bash生成另一個互動式bash實例。

簡而言之,這應該有效:

gnome-terminal \
 --tab-with-profile=Default --title=PROG1 -e "bash -c \"trap 'bash' 2; clear;ls;./prog1; exec bash\"" \
 --tab-with-profile=Default --title=SIMULATOR -e "bash -c \"trap 'bash' 2; clear;ls;./simulator; exec bash\"" \
 --tab-with-profile=Default --title=PROG2 -e "bash -c \"trap 'bash' 2; clear;ls;./prog2; exec bash\"" \
 --tab-with-profile=Default --title=DATA -e "bash -c \"trap 'bash' 2; ./data -f \"/home/user/NetBeansProjects/data3.txt\" -p \"6785\"; exec bash\"" \
 --tab-with-profile=Default --title=PROG3 -e "bash -c \"trap 'bash' 2; cd /home/user/NetBeansProjects/simulator;./prog3; exec bash\"" \
&

引用自:https://unix.stackexchange.com/questions/234247