Как запустить xfce-терминал с разными командами для каждой вкладки и продолжать использовать вкладки после их возврата?

20

Чтобы сохранить обзор, мне нравится размещать несколько команд всегда в одном и том же порядке и запускать их автоматически вместе (gradle, git, database, scala-REPL, jboss ...)

-H (удержание), кажется, означает, что терминал не закрывается после завершения, но как я могу завершить такой процесс преднамеренно? Не за что? Таким образом, что я могу продолжать использовать терминал.

Я использую xubuntu с xfce4-терминал и Bash. Есть ли лучшее GUI-решение для запуска нескольких команд с возможностью продолжить работу в этом окне / вкладке?

Обновление: если вы не знаете эти команды: Jboss и gradle непрерывно генерируют вывод, который вы не хотите смешивать в одном терминале. И иногда их нужно прервать с помощью ^ C и перезапустить. Я не люблю открывать термин xfce4 и переходить в каталог, в котором мне нужно действовать.

База данных и 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 (execute). Я думаю, что для scala-REPL это работает, так как это последняя команда в списке.

неизвестный пользователь
источник
Ваш вопрос до сих пор неясен для меня. Вы хотите, чтобы терминал вернулся в оболочку после завершения команды, с которой он был запущен? Что то типа xterm -e 'stuff;bash'?
frostschutz
1
Этот вопрос все еще нуждается в работе! Я нашел эту ветку, думаю, это то, что ищет ОП: как сохранить открытый xfce4-терминал? , Он хочет знать, как получить доступ к вкладке, где использовался ключ "-H", и продолжать использовать его как обычное окно терминала. OP, не могли бы вы подтвердить, если я прав?
СЛМ
@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-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 CONTна ВЗОМТ из cmd.

Стефан Шазелас
источник
Вау. Это довольно сложно, но, похоже, работает. :) Я не знаю, почему награда исчезла. К сожалению, у меня не было времени, чтобы проверить подсказки.
пользователь неизвестен
Я не очень понимаю все правила системы вознаграждений. Поскольку я думаю, что вы заслуживаете награду, я перезапускаю новую награду.
пользователь неизвестен
Да, срок действия премий истекает через 7 дней, и у вас есть 24 часа, чтобы их наградить. Если вы не знаете их, они назначаются любому пользователю с самым высоким повторением (2 или выше). Здесь больше , чем вы когда - либо хотели знать о щедротах 8-): meta.stackexchange.com/questions/16065/...
ОДС
1
@AdrianLopez, в bashсценариях нет истории вообще, так как нет редактирования строк или взаимодействия с пользователем, если вы не используете read -eв своем сценарии (и вы увидите, что это history -s textработает, чтобы заполнить историю, видимую этим read -e). Здесь мы запускаем не history -sскрипт, а $PROMPT_COMMANDинтерактивную оболочку.
Стефан
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-терминал -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Если вы используете Gnome Terminal, вы должны написать --tab также перед первой командой.
Рафаэль Кавальканти
Это немного полезно, хотя и не так, как я надеялся. Когда я запускаю gradle с `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradle explodedWar explodedWarSync; bash' "` открывается вкладка с именем, но она показывает "gradle: команда не найдена "при вводе команды там отлично работает. Git, mysql и scala отлично работают таким образом, но для jboss Ctrl-C завершает всю вкладку jboss. Я мог только подготовить оболочку, начинающуюся там - возможно, повторяя команду для ввода. Я не очень понимаю, в чем здесь разница.
пользователь неизвестен
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 с вкладками

   ss of xfce w / top Ctrl + C

SLM
источник
0

При выходе из оболочки без -Hтерминала тоже будет закрыто. С этим флагом терминал продолжит работу, но процесс оболочки закрыт и не может быть восстановлен.

Я думаю, что вы пытаетесь архивировать, что вы просто запускаете свой терминал и ваша среда разработки запускается?

Вы можете создать сценарий оболочки и поместить в него все свои команды. В конце скрипта вы просто запускаете свою оболочку:

#!/bin/sh

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

$SHELL

# some cleanup commands if needed

Затем вызовите этот скрипт через xfce4-terminal -e /the/script. При выходе из$SHELL родительского процесса (вашего скрипта) завершен, и фоновые задачи также получат сигнал выхода и выход.

Если вы хотите сохранить их, используйте, например, nohup jboss &в вашем скрипте

Крисси
источник
Это не работает, потому что gradle и jboss постоянно производят вывод. Вам не нравится, когда они смешивают свои результаты. База данных и scala-терминал являются интерактивными. Нет смысла откладывать их на задний план. Идея открывать другие команды на разных вкладках заключается в том, что история заполнена несколькими разными командами только одной темы и поэтому быстро просматривается.
пользователь неизвестен