탭마다 다른 명령으로 xfce-terminal을 실행하고 명령이 반환 된 후 탭을 계속 사용하는 방법은 무엇입니까?


20

개요를 유지하기 위해 여러 명령을 항상 동일한 순서로 배치하고 자동으로 함께 시작합니다 (gradle, git, database, scala-REPL, jboss ...)

-H (보류)는 종료 후에 터미널이 닫히지 않았 음을 의미하지만 그러한 프로세스를 의도적으로 종료하는 방법은 무엇입니까? 전혀? 그런 식으로 터미널을 계속 사용할 수 있습니다.

xubceu를 xfce4 터미널 및 bash와 함께 사용하고 있습니다. 해당 창 / 탭에서 계속 작업 할 수있는 기능으로 여러 명령을 시작하는 더 나은 GUI 솔루션이 있습니까?

업데이트 : 이러한 명령을 모르는 경우 Jboss와 gradle은 지속적으로 출력을 생성하므로 동일한 터미널에서 혼합하고 싶지 않습니다. 그리고 때로는 ^ C로 중단하고 다시 시작해야합니다. xfce4 용어를 다시 열고 싫어하는 디렉토리로 이동하는 것을 좋아하지 않습니다.

데이터베이스와 스칼라 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 터미널을 열린 상태로 유지하는 방법 은 무엇 입니까? . "-H"스위치가 사용 된 탭에 액세스하고이를 일반 터미널 창으로 계속 사용하는 방법을 알고 싶어합니다. OP, 내가 맞는지 확인해 주시겠습니까?
slm

@ slm : 예, 추가 명령을 처리하기 위해 터미널을 열어 두는 것이 좋습니다. 명령 중 첫 번째 명령을 자동으로 시작하고 이름이 지정된 여러 탭이 있습니다.
사용자가 알 수 없음

답변:


21

-H/-hold옵션은 어플리케이션이 (쉘 또는 다른)에서 시작하면 종료 된 터미널 에뮬레이터 창을 열어 유지하는 것입니다. 그 상태에서는 더 이상 일어날 수 없습니다.

xfce4 터미널 터미널 에뮬레이터에서 대화식 쉘의 작업으로 명령을 시작하고 셸을 계속 실행하고 응용 프로그램이 종료 된 후 대화식으로 사용하려는 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-Zfg/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가 종료됩니다 .shcmd
  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-) : meta.stackexchange.com/questions/16065 / ...
slm

1
bash스크립트 에서 @AdrianLopez는 스크립트에서 사용하지 않는 한 라인 편집이나 사용자 상호 작용이 없기 때문에 기록이 전혀 없습니다 read -e(그리고 history -s text그 역사가 주요 내용으로 표시됩니다 read -e). 여기서는 history -s스크립트가 아니라 $PROMPT_COMMAND대화식 쉘 의 후크 에서 실행 됩니다 .
Stéphane Chazelas

1
@ StéphaneChazelas 어메이징. 여기에 다른 귀중한 답변을 따르면 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' "그놈 터미널을 사용한다면, 첫 번째 명령 앞에 --tab을 써야합니다.
라파엘 카 발칸 티

이것은 내가 바라는 한은 아니지만 약간 도움이됩니다. `xfce4-terminal --working-directory = / home / stefan / oximity / med -e "bash -c 'gradle explodedWar explodedWarSync; bash'"로 gradle을 시작하면 탭이 열리고 이름이 "gradle : command not found "명령을 입력하는 동안 제대로 작동합니다. 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'"

이것은 당신에게 다음을 줄 것입니다 :

   탭이있는 xfce의 ss

   상단 Ctrl + C를 가진 xfce의 ss


0

-H터미널 없이 쉘을 종료하면 닫힙니다. 이 플래그를 사용하면 터미널은 계속 실행되지만 셸 프로세스는 닫히고 복구 할 수 없습니다.

터미널을 시작하고 개발 환경이 시작되었다는 것을 보관하려고 생각하십니까?

쉘 스크립트를 작성하고 그 안에 모든 명령을 넣을 수 있습니다. 스크립트가 끝나면 쉘을 시작하면됩니다.

#!/bin/sh

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

$SHELL

# some cleanup commands if needed

그런 다음을 통해이 스크립트를 호출하십시오 xfce4-terminal -e /the/script. 에서 종료되면 $SHELL부모 프로세스 (스크립트)을 완료하고 백그라운드 작업도 종료 신호를 수신하고 종료됩니다.

당신이 그들을 살아있는 유지하려면 예를 들어 nohup jboss &스크립트에서 사용


gradle 및 jboss가 영구적으로 출력을 생성하기 때문에 작동하지 않습니다. 당신은 그것들을 그들의 출력을 섞어 놓고 싶지 않습니다. 데이터베이스 및 스칼라 터미널은 대화식입니다. 그것들을 배경에 넣는 것은 의미가 없습니다. 다른 탭에서 다른 명령을 여는 아이디어는 하나의 주제에 대한 몇 가지 명령만으로 히스토리가 채워 져서 빠르게 탐색 할 수 있다는 것입니다.
사용자가 알 수 없음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.