Xfce4-Terminal

如何在每個選項卡上使用不同的命令執行 xfce-terminal 並在命令返回後繼續使用選項卡?

  • December 11, 2018

為了保持概述,我喜歡將多個命令始終以相同的順序放置並自動一起啟動它們(gradle、git、數據庫、scala-REPL、jboss…)

-H (hold) 似乎意味著終端在終止後沒有關閉,但是我如何故意終止這樣的過程呢?一點也不?這樣我就可以繼續使用終端了。

我將 xubuntu 與 xfce4-terminal 和 bash 一起使用。是否有更好的 GUI 解決方案來啟動多個命令,並能夠繼續在該視窗/選項卡中工作?

**更新:**如果您不知道這些命令:Jboss 和 gradle 不斷產生輸出,您不希望在同一個終端中混合使用。有時他們需要用 ^C 打斷,然後重新啟動。我不喜歡重新打開 xfce4-term 並導航到我需要操作的目錄。

數據庫和 scala-REPL 是互動式的,所以在後台啟動它們是沒有意義的。

我目前的啟動腳本只是導航到所需的目錄,並以正確的順序打開所有選項卡以始終在同一位置找到它們,並為其命名每個選項卡:

xfce4-terminal -T eclipse   --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
   --tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
   --tab -T bash       --working-directory=/home/stefan/oximity \
   --tab -T gradle     --working-directory=/home/stefan/oximity/med \
   --tab -T git        --working-directory=/home/stefan/oximity/med \
   --tab -T mysql      --working-directory=/opt/mini/mysql \
   --tab -T jboss      --working-directory=/opt/mini/jboss \
   --tab -T jboss-log  --working-directory=/opt/mini/jboss/standalone/log \
   --tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala

Eclipse 和 arandr 與 shell 分離並在它們自己的視窗中執行,因此 -e(執行)參數有效。我認為對於 scala-REPL 它是有效的,因為它是列表中的最後一個命令。

選項是在其中-H/-hold啟動的應用程序(shell 或其他)退出後保持終端仿真器視窗打開。在那種狀態下,不會再發生任何事情了。

如果您想在 xfce4-terminal 終端仿真器中將命令作為互動式 shell 的作業啟動並保持 shell 執行並在應用程序退出後以互動方式使用它bash,您可以使用$PROMPT_COMMAND環境變數xfce-terminal啟動在第一個提示符之前啟動給定命令的互動式 shell。

xfce4-terminal \
 -T eclipse \
 --working-directory=/home/stefan/oximity \
 -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; /opt/eclipse/eclipse" bash' \
 \
 --tab -T arandr \
 --working-directory=/home/stefan/oximity \
 -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; arandr /home/stefan/.screenlayout/oximity.sh" bash' \
 \
 --tab -T bash \
 --working-directory=/home/stefan/oximity \
 ...

這樣,命令是該 shell 的作業,這意味著您可以暫停它們Ctrl-Z並稍後恢復它們,fg/bg就像您在該互動式 shell 的提示符下輸入它們一樣。

這假設您沒有$PROMPT_COMMAND~/.bashrc. 另請注意,該命令的退出狀態在$?.

為了使它更像是在 shell 提示符下輸入的命令,您甚至可以將其添加到歷史列表中。像:

xfce4-terminal -T /etc/motd -e 'env PROMPT_COMMAND="
 unset PROMPT_COMMAND
 history -s vi\ /etc/motd
 vi /etc/motd" bash'

這樣,一旦退出vi,您就可以按Up鍵來呼叫相同的vi命令。

更簡單的寫法:

PROMPT_COMMAND='unset PROMPT_COMMAND; history -s "$CMD"; eval "$CMD"' \
 xfce4-terminal --disable-server \
         -T /etc/motd -e 'env CMD="vi /etc/motd" bash' \
   --tab -T       top -e 'env CMD=top bash'

這:

xfce4-terminal -e 'sh -c "cmd; exec bash"'

其他答案中給出的解決方案有效,但有一些缺點:

  1. 如果在執行時按下Ctrl-Ccmd則會殺死外部,因為和sh都只有一個程序組。sh``cmd
  2. 你不能Ctrl-Z用來暫停cmd
  3. 與該$PROMPT_COMMAND方法一樣,命令的退出狀態在$?.

您可以通過以下方式解決上述問題:

xfce4-terminal -e 'sh -c "trap : INT; cmd; exec bash"'

或者:

xfce4-terminal -e 'sh -ic "cmd; exec bash"'

使用後一個,您還可以使用 暫停該過程Ctrl-Z,但您將無法使用fg/bg它。您可以通過kill -s CONT對*.*cmd

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