Як я можу зробити скрипт, який відкриває термінальні вікна та виконує команди в них?


140

У мене є три сценарії, які мені потрібно запустити, коли я запускаю свою машину Ubuntu, вони запускають сервіси, які я використовую в моєму середовищі розробки.

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

Чи є спосіб створити скрипт, який відкриє три термінали та виконує по одній команді в кожному з них? (Кожна команда повинна знаходитися в окремому вікні терміналу, щоб я міг бачити їх вихід).

Відповіді:


138
gnome-terminal -e command

або

xterm -e command

або

konsole -e command

Доволі багато

terminal -e command

Щоб заставити термінал залишитися, коли команда закінчується:

У консолі є --nocloseпрапор.

У xterm є -holdпрапор.

У gnome-terminalперейдіть до Edit -> Профіль Налаштування -> Title . Перейдіть на вкладку Command . Виберіть Затримати термінал у спадному меню з написом Коли команда завершується . Ви повинні створити для цього новий профіль і виконати за допомогою

gnome-terminal - window-with-profile = команда NAMEOFTHEPROFILE -e

1
Якщо я спробую затримати термінал, я отримаю "дочірній процес, який нормально виходить із кодом статусу 127"
Даршан Чадхарі

2
gnome-terminal вже не має опції заголовка :(
törzsmókus

1
@ törzsmókus це справді 2017 рік! Випуски LTS мають 5-річний термін служби. 14.04 закінчується до квітня 2019 року. Wiki.ubuntu.com/Опублікує
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.


У цьому випадку це не дуже допоможе, оскільки запитувач хоче зробити щось, що не однакове для всіх терміналів.
nickguletskii

Спроба №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 Я повинен був би повернутися додому, щоб дати кращі вказівки, але ідея полягає в тому, щоб створити спеціальний профіль із цим набором параметрів, а також використовувати ім'я спеціального профілю у вказаному вище місці.
Karthik T

2
@cipricus, якщо цього вам достатньо, то це нормально. Профіль - це не що інше, як група налаштувань. Ви можете встановити налаштування ТОЛЬКІ для використання у вашому сценарії, а не використовувати їх у всіх терміналах. Ви можете побачити Редагувати -> Профілі, щоб побачити всі наявні у вас профілі, і ви додали б туди, яка була налаштована так, як пояснено у публікації, яку ви пов’язали
Karthik T

5

За допомогою відповіді @ nickguletskii та мого власного коментаря під його відповіддю та натхненного відгуком @ grabantot мого коментаря, ось мій кращий спосіб зробити це, особливо коли я хочу, щоб термінал залишався відкритим, щоб потім я міг його вручну використовувати.

Вих. використання: це дійсно корисно додати до ваших запуску програм, щоб цей скрипт запустився, відкрив термінал, створив і назвав вкладку в терміналі та запустив команду для вас. Або ви можете просто додати символьний посилання до цього сценарію на робочий стіл. Я використовую такий тип підходу, щоб я міг двічі клацнути одну піктограму на своєму робочому столі і запропонувати їй відкрити купу терміналів (з різними вкладками, названими відповідно до того, яку роботу я буду робити в них) та програм для налаштування моє середовище програмування, наприклад, для щоденної роботи.

Ось надуманий приклад, який відкриває одну вкладку, називає її "тестувати", після чого виконує просту команду 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 = відкрити gnome-термінал
  • --tab = відкрити унікальну вкладку для наступного
  • --title="tab 1" = назва цієї вкладки "вкладка 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= запустити bash -c 'cd /etc; ls; $SHELL'команду, яка є командою, яку я щойно склав як приклад; ось що це робить:
    • bash -c каже, що це башмак
    • cd /etc = 'c'hange' d'irectory в шлях "/ etc"
    • ls = 'Я не вміст цього каталогу
    • $SHELL= цей криптовалютний елемент потрібен, щоб оболонка була відкритою, щоб ви могли працювати з нею. Якщо ви хочете, щоб оболонка відкрилася, запустіть свою команду, а потім закрийте, просто видаліть цю частину. Я, однак, хочу, щоб вкладка залишалася відкритою, щоб я міг зробити програмування магією. :)
  • потім ми починаємо знову на --tabчастині, щоб створити вкладку 2, потім знову для вкладки 3. Налаштуйте вміст свого серця.

Знімок екрана:

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


1
рада, що я була корисною) У мене також є сценарії, на які я можу просто натиснути і почати працювати над проектом. З ними виникли дві проблеми: багато вікон терміналів (для них був цілий окремий екран) та закриття вікон, наприклад, після збоїв сервера. Ця відповідь вирішує обидві мої проблеми з --tab + $ SHELL. Ніцца
грабантот

1

коментуючи відповідь Лекенштейна. Я знаю, що це стара публікація, але для тих, хто вважає це корисним (як я щойно робив), замість того, щоб робити ще один "хакі-скрипт", просто поставивши функцію всередині сценарію, який ви дзвоните

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

Викличте свій скрипт за допомогою "x-terminal-emulator -e / path / to / script hacky_function необов'язкові аргументи тут"

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


-2

Використовуйте команду screen та -d від'єднайтесь від існуючого сеансу на екрані та повторно вставте тут -m примушуйте новий екранний сеанс -S створіть названий сеанс замість використання імені за замовчуванням


ця відповідь зовсім не зрозуміла, будь ласка, будь ласка, будьте зрозумілішими
azerafati

@azerafati дійсно, екран не відкриває жодного вікна терміналу ... навіть не призначений цим дивовижним пакетом ...
erm3nda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.