タブごとに異なるコマンドでxfce-terminalを実行し、コマンドが戻った後もタブを使用し続ける方法は?


20

概要を維持するために、複数のコマンドを常に同じ順序で配置し、それらを自動的に一緒に開始するのが好きです(gradle、git、データベース、scala-REPL、jboss ...)

-H(ホールド)は、終了後に端末が閉じられていないことを意味するようですが、そのようなプロセスを意図的に終了するにはどうすればよいですか?どういたしまして?ターミナルを使い続けることができるような方法で。

私はxfce4-terminalとbashでxubuntuを使用しています。複数のコマンドを起動するためのより良い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はシェルから切り離され、独自のウィンドウで実行されるため、-e(実行)パラメーターが機能します。scala-REPLについては、リストの最後のコマンドであるため動作すると思います。


あなたの質問は私にはまだ不明です。起動されたコマンドが終了したら、ターミナルをシェルに戻しますか?のようなものxterm -e 'stuff;bash'
frostschutz

1
この質問にはまだ作業が必要です!私はこのスレッドを見つけました、これはOPが探しているものだと思います:xfce4-terminalを開いたままにする方法。彼は、「-H」スイッチが使用されているタブにアクセスし、通常のターミナルウィンドウとして引き続き使用する方法を知りたいと考えています。OP、私が正しいかどうか確認してください。
slm

@slm:はい、ターミナルを開いたままにして、さらにコマンドを処理します。最初のコマンドを自動的に開始し、複数の名前の付いたタブを作成するだけです。
ユーザー不明

回答:


21

-H/-holdオプションは、アプリケーションがそれ(シェルまたは他の)で開始した後に終了した端末エミュレータウィンドウのオープンを維持することです。その状態では、これ以上何も起こり得ません。

xfce4-terminalターミナルエミュレーターで対話型シェルのジョブとしてコマンドを開始し、シェルを実行し続け、アプリケーションの終了後に対話的にbash使用する場合は、$PROMPT_COMMAND環境変数を利用してxfce-terminal開始できます最初のプロンプトの直前に特定のコマンドを開始する対話型シェル。

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 \
  ...

このように、コマンドはそのシェルのジョブであるため、その対話型シェルのプロンプトでコマンドを入力したかのように、コマンドを一時停止し、Ctrl-Z後で再開できfg/bgます。

ただし、に設定しないと仮定$PROMPT_COMMANDします~/.bashrc。また、コマンドの終了ステータスはでは利用できないことに注意してください$?

シェルプロンプトでコマンドを入力したようにするには、履歴リストに追加することもできます。のような:

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-Cしながら、cmd実行されている、それは外側を殺しsh、両方のための唯一のプロセスグループがありますので、shとはcmd
  2. Ctrl-Z一時停止には使用できませんcmd
  3. $PROMPT_COMMANDアプローチと同様に、コマンドの終了ステータスはで利用できません$?

上記の1を回避するには、次のようにします。

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

または:

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

後者ではCtrl-Z、を使用fg/bgしてプロセスを一時停止することもできますが、そのプロセスで使用することはできません。kill -s CONTpidを実行することで、バックグラウンドで続行できますcmd


ワオ。それはかなり複雑ですが、うまくいくようです。:)報酬が消えた理由はわかりません。残念ながら、ヒントをテストする時間はありませんでした。
ユーザー不明

バウンティシステムのすべてのルールを本当に理解しているわけではありません。報奨金に値すると思うので、新しい報奨金を再開します。
ユーザー不明

賞金は7日後に失効します。24時間後に賞金が与えられます。あなたがそれらに気付いていない場合、彼らは最高の担当者(2以上)を持つ任意のユーザーに割り当てられます。賞金について知りたいと思った以上のものがあります8
slm

1
@AdrianLopez、bashスクリプトでは、スクリプトで使用read -eしない限り、行の編集やユーザーの操作がないため、履歴はまったくありません(そして、history -s textそこから見える履歴をプライミングするために動作することがわかりますread -e)。ここではhistory -s、スクリプトからではなく$PROMPT_COMMAND、対話型シェルのフックから実行しています。
ステファンシャゼラス

1
よろしくお願いします!ここでの他の貴重な答えに続いてxfce4-terminal、少なくともバージョン0.6.3では追加のパラメーターが必要になったことを追加する必要があります-- --disable-server環境を通過します。参考:lists.debian.org/debian-user/2017/10/msg00045.html
ジョージ

5

あなたの質問を理解している限り、ターミナルでいくつかのプロセスを実行し、それらをCtrl+ Cし、その後、シェルでウィンドウを開いたままにしておきたいと思っています。

私が正しい場合、これは次のようなコマンドで実現できます。

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"

複数のタブで動作しますか?
ユーザー不明

@userunknown確かに。他のコマンドの前に--tabを追加するだけです。たとえば、「ls / etc」および「ls / dev」を実行する場合は、xfce4-terminal -e "bash -c 'ls / etc; exec bash'" -​​-tab -e "bash- c 'ls / dev; exec bash' "Gnomeターミナルを使用する場合、最初のコマンドの前にも--tabを記述する必要があります。
ラファエルカヴァルカンティ

私が望んでいたほどではありませんが、これは少し役立ちます。`xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradleexplosedWarコマンドの入力中にコマンドが見つかりません」と表示されます。Git、mysql、およびscalaはそのように機能しますが、jbossの場合、Ctrl-Cはjboss-tab全体を終了します。私はそこからシェルを準備することしかできませんでした-入力するコマンドをエコーするかもしれません。私はここで何が違いを生んでいるのか本当に理解していません。
ユーザー不明

1

xfce4-terminalタブ内の複数のアプリ

各xfceタブにインタラクティブシェルを追加する

このハックを使用してCtrl+C、タブの場合にタブを追加できます。

$ xfce4-terminal -H \
     --tab -T bash -e "bash -c 'top;bash'" \
     --tab -T git  -e "bash -c 'top;bash'"

これにより、以下が得られます。

   ss of xfce w / tabs

   ss of xfce w / top Ctrl + C


0

-Hターミナルなしでシェルを終了するときも閉じられます。このフラグを使用すると、ターミナルは実行され続けますが、シェルプロセスは閉じられ、復活できません。

ターミナルを起動するだけで、開発環境が起動することを証明しようとしていると思いますか?

シェルスクリプトを作成し、その中にすべてのコマンドを配置できます。スクリプトの最後で、シェルを開始するだけです。

#!/bin/sh

gradle &
git &
... &
.... &
jboss &

$SHELL

# some cleanup commands if needed

次に、を介してこのスクリプトを呼び出しますxfce4-terminal -e /the/script。終了すると$SHELL、親プロセス(スクリプト)が終了し、バックグラウンドタスクも終了信号を受信して終了します。

それらを生かしたい場合は、例えばnohup jboss &スクリプトで使用してください


gradleとjbossは永続的に出力を生成するため、これは機能しません。あなたは彼らに彼らの出力を混同させることを好まない。データベースとscala-terminalはインタラクティブです。それらをバックグラウンドに置く意味はありません。別のタブで他のコマンドを開くという考え方は、履歴は1つのトピックに対するいくつかの異なるコマンドで満たされているだけであり、したがって高速に閲覧できるということです。
ユーザー不明
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.