Как мне сделать скрипт, который открывает окна терминала и выполняет в них команды?

140

У меня есть три сценария, которые мне нужно запустить при запуске компьютера с Ubuntu, они запускают службы, которые я использую в своей среде разработки.

Для этого я вручную открываю три терминала и набираю команды.

Есть ли способ создать скрипт, который откроет три терминала и выполнит одну команду в каждом из них? (Каждая команда должна быть в отдельном окне терминала, чтобы я мог видеть их вывод).

И.С.Бах
источник

Ответы:

138
gnome-terminal -e command

или же

xterm -e command

или же

konsole -e command

Довольно много

terminal -e command

Чтобы терминал оставался при выходе из команды:

В консоле есть --nocloseфлаг.

В xterm есть -holdфлаг.

В gnome-terminal, перейдите в Edit -> Настройки профиля -> Заголовок . Перейдите на вкладку « Команда ». Выберите « Удерживать терминал» в раскрывающемся меню с надписью « При выходе из команды» . Вы должны создать новый профиль для этого и выполнить с

gnome-терминал --window-with-profile = NAMEOFTHEPROFILE -e команда
nickguletskii
источник
1
Если я пытаюсь удержать терминал, я получаю «дочерний процесс завершается нормально с кодом состояния 127»
Даршан Чаудхари
2
У gnome-терминала больше нет опции заголовка :(
törzsmókus
1
@ törzsmókus это действительно 2017 год! Релизы LTS имеют 5-летнюю поддержку. 14.04 не заканчивается до апреля 2019 года. Wiki.ubuntu.com/Releases
bhass1
1
gnome-terminal -e commandработает только если commandцитируется. Так что это не работает: gnome-terminal -e "echo hello world; sleep 3"но это делает: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Вздох.
bgoodr
3
Вы также можете оставить gnome-терминал открытым, добавив ; $SHELLв конец команды. Пример:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Габриэль Стейплс
58

Вместо жесткого программирования gnome-terminal, konsoleи так далее, используйте систему Альтернатив. Программа, которая выполняет эмулятор терминала по умолчанию:

x-terminal-emulator

В моей системе он открывает новый экземпляр Konsole каждый раз, когда я выполняю эту команду.

К счастью, терминалы, кажется, поддерживают -eопцию для выполнения команды (я проверил это для konsoleи gnome-terminal). Аргументы после команды передаются вызываемой команде. Bash отказывается оставаться открытым в моем терминале, для получения терминала необходим дополнительный скрипт:

#!/bin/sh
"$@"
exec "$SHELL"

Если вы сохранили предыдущий скрипт как /home/user/hackyи сделали его исполняемым, вы должны запустить свои скрипты с:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

Полный путь обязателен и /home/user/hackyдолжен быть исполняемым.

Моя предыдущая попытка запустить скрипт в новом окне терминала была найдена в ревизии # 2 , это было до того, как я понял, что аргументы могут быть переданы x-terminal-emulator.

Lekensteyn
источник
В этом случае это не сильно поможет, так как просящий хочет сделать что-то, что не одинаково для всех терминалов.
Никгулецкий
Попытка № 3: этот должен держать терминал открытым и запускать программу с необязательными аргументами.
Лекенштейн
1
Я использовал опцию gnome, однако после запуска скрипта главный терминал закрывается !! .. есть идеи почему?
Маклан
3
@ Suda.nese То есть, по замыслу, когда «терминал» завершает выполнение скрипта, он завершает работу, потому что больше нечего делать. Вы можете «исправить» это, вызвав оболочку, в которой вы можете выполнять команды ( bash) или иметь такую ​​строку, как read -p "Press Return to continue".
Лекенштейн
1
Как вы можете запустить более одной команды в терминале? Например cd xxx && start.sh. Интерпретатор видит && как вторую часть команды (что логично), но если я кавычу, то он пытается выполнить все это как один большой аргумент
Ричард
9

Довольно просто-

#!/bin/bash

/etc/init.d/ccpd status

Этого достаточно для других команд, которым не нужно ничего отображать в терминале. Но здесь нужно видеть отображаемый статус.
Таким образом, он должен работать в окне терминала

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

Другой пост предназначен []для заполнения

Здесь «NAMEOFTHEPROFILE» должен быть заменен именем профиля, который «удерживает терминал при выходе из команды».

введите описание изображения здесь

введите описание изображения здесь

Картик Т
источник
1
@cipricus, я думаю, []был просто заполнителем
Karthik T
понял. но я должен сделать так, чтобы терминал не закрывался так быстро. Я думаю, что это также в связанном вопросе
@cipricus вы пробовали профиль? Просто нужно добавить --window-with-profile=NAMEOFTHEPROFILEк тому, что я дал
Karthik T
1
@cipricus Я должен был бы вернуться домой, чтобы дать лучшие инструкции, но идея состоит в том, чтобы создать специальный профиль с этим набором параметров и использовать имя специального профиля в месте выше.
Картик Т
2
@cipricus, если тебе этого достаточно, то это нормально. Профиль - это не что иное, как группа настроек. Вы можете настроить параметры ТОЛЬКО для использования в вашем скрипте, и не обязательно использовать его во всех терминалах. Вы можете увидеть Edit -> Profiles, чтобы увидеть все ваши профили, и вы бы добавили туда один, который был настроен, как описано в посте, который вы связали
Karthik T
5

С учетом ответа @ nickguletskii и моего собственного комментария под его ответом, а также вдохновленного комментариями @ grabantot моего комментария, вот мой предпочтительный способ сделать это, особенно когда я хочу, чтобы терминал оставался открытым, чтобы затем я мог использовать его вручную.

Ex. Использование: это действительно полезно добавить в ваши автозагрузки, чтобы этот скрипт запускался, открывал терминал, создавал и называл вкладку в терминале и запускал команду для вас. Или вы можете просто добавить символическую ссылку на этот скрипт на рабочий стол. Я использую этот тип подхода, поэтому я могу дважды щелкнуть один значок на рабочем столе и открыть для него несколько терминалов (с различными вкладками, названными в соответствии с тем, что я собираюсь сделать в них) и программами для настройки. моя среда программирования, например, для повседневной работы.

Вот надуманный пример, который открывает одну вкладку, называет ее «test», а затем запускает в ней простую команду cd /etc; ls. $SHELLЧасть в конце заставляет оболочку оставаться открытыми , так что вы можете увидеть его выход и продолжать использовать его (я узнал об этом где - то еще на переполнение стека):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

Вот более сложный пример, который открывает 3 отдельные вкладки в одном терминале gnome. Это именно то, что делает мой ярлык на рабочем столе, чтобы я мог сразу открыть несколько окон программирования:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

Вот разбивка этой команды выше:

  • gnome-terminal = открыть терминал гнома
  • --tab = открыть уникальную вкладку для того, что будет дальше
  • --title="tab 1" = название этой вкладки "вкладка 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= запустить bash -c 'cd /etc; ls; $SHELL'команду, которую я только что составил в качестве примера; вот что он делает:
    • bash -c говорит, что это bash 'c'ommand
    • cd /etc = 'c'hange' d'irectory в путь "/ etc"
    • ls = 'l'i's Содержимое этого каталога
    • $SHELL= этот загадочный лакомый кусочек необходим, чтобы держать оболочку открытой, чтобы вы могли с ней работать. Если вы хотите, чтобы оболочка открылась, выполните команду, затем закройте, просто удалите эту часть. Я, однако, хочу, чтобы вкладка оставалась открытой, чтобы я мог заниматься магией программирования. :)
  • затем мы снова начинаем с --tabчасти, чтобы создать вкладку 2, а затем снова за вкладку 3. Настройте по своему вкусу.

Скриншот:

введите описание изображения здесь

Габриэль Стейплс
источник
1
рад, что мне помогло) У меня также есть сценарии, по которым я могу просто щелкнуть и начать работать над проектом. С ними было две проблемы: множество окон терминала (для них был отдельный экран) и закрытие окон, например, после сбоев сервера. Этот ответ решает обе мои проблемы с --tab + $ SHELL. Ницца
грабантот
1

комментируя ответ Лекенштейна. Я знаю, что это старый пост, но для тех, кто находит это полезным (как я только что) Вместо того, чтобы делать еще один «хакерский скрипт», просто поместите функцию внутри скрипта, который вы вызываете

hacky_function()
{
"$@"
exec "$SHELL"
}

Вызовите ваш скрипт с помощью «необязательных аргументов х-терминала-эмулятора -e / path / to / script здесь»

Не забудьте поставить «$ @» в конце скрипта

Sruli
источник
-2

Используйте экранную команду и -d отсоединиться от существующего экранного сеанса и подключите его здесь -m принудительно запустить новый экранный сеанс -S создать именованный сеанс вместо использования имени по умолчанию

Джек Хит
источник
этот ответ не совсем понятен, пожалуйста, позаботьтесь о том, чтобы сделать его более понятным
azerafati
@azerafati, действительно, экран не открывает окно терминала ... даже не предназначено для этого потрясающего пакета ...
erm3nda