Відкриття декількох вкладок терміналів та виконання команди


9

Мені потрібно відкрити кілька вкладок терміналів, дати їм заголовки, перейти в каталог і зробити так, щоб кожна вкладка виконувала команду.

Я новачок у скриптах для Linux та оболонок, після пошуку в Інтернеті та перевірки деяких рішень я створив цей сценарій ( ВИДАЛЕНО на основі відповідей нижче):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Він відкриває вкладки, називає їх, але не виконує команди, що генерують цю помилку:

Під час створення дочірнього процесу для цього терміналу сталася помилка

Ще один недолік полягає в тому, що якщо я зупиняю запущену команду, вона закриє вкладку, чого я не хочу. Мені потрібно мати можливість зупинити команду і запустити її знову на тій же вкладці.

Що не так із сценарієм? Чи є ще один простіший спосіб зробити це?

Примітка: Якщо я вилучив із команди команду (-e "\" bash -c $ {cmds [i]}; bash \ ""), вона відкриє вкладки у вказаному каталозі та назве їх без помилок.

-Редагувати-1:

Після застосування @Tuknutx відповіді нижче та редагування сценарію, помилка більше не з’являється, але це дає мені bash: rails c: command not foundі rails sстворює нову програму rails замість запуску сервера рейлів, я використовую .rmvrc для вибору гемсета після доступу до цієї папки. .


Якщо ви хочете, щоб ваш скрипт запускався під час завантаження ubuntu: - ви можете запустити сценарій як послуга на початку ( help.ubuntu.com/community/UbuntuBootupHowto ) або: використовуючи "програми запуску" у робочому середовищі
Aboelnour

якщо я пишу, cmds[1]="'ping 192.168.9.9'"це дає мені ту ж помилку, але я вирішив її, видаливши одну пропозицію. Тож якщо я напишу, cmds[1]="ping 192.168.9.9"це працює.
ромашка

@Brary, але я не розумію, чому він відкриває три вкладки - одна за замовчуванням і ще дві, що встановлені в сценарії. Тому що ми визначаємо tab=" --tab-with-profile=Default"??
ромашка

Відповіді:


3

Я б рекомендував використовувати tmuxз tmuxinator, це зробить роботу для вас, і ви також можете покластися на terminatorмакети!

Для terminatorоформлення оформлення замовлення відповідь mhnagaoka тут також askubuntu:

  1. Після налаштування макета клацніть правою кнопкою миші на будь-якому тлі терміналу та виберіть Налаштування → Вкладка « Макети » та натисніть кнопку Додати .

  2. Дайте ім’я та натисніть Закрити .

  3. Це має створити згаданий ~/.config/terminator/configфайл.

  4. Тепер ви можете запустити термінатор, використовуючи збережений макет, використовуючи: terminator -l yourLayout(замініть свій макет тим, що обрали на кроці 2).

  5. (необов’язково) Відредагуйте ~/.config/terminator/configфайл так, щоб там, де він говорив [layouts]і вклався під ним [[yourLayout]], перейменуйте свій макет на типовий і видаліть / перейменуйте попередній макет за замовчуванням . Тепер, коли Terminator запускається без будь-яких параметрів, він завантажить ваш власний [[default]]макет!


2

Підсумовуючи кілька інших відповідей та їх коментарів, ось що я закінчив:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Зауважте, що я зняв вкладку "головний", а також профілі та заголовки (які здаються застарілими у gnome-terminal).


Вихід $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal."Використовувати" - "для завершення параметрів і розміщення командного рядка для виконання після нього. . that's an output but the comands get executed. When i use $ tab - `команда не виконується і термін dsisplays:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee

1

Спробуйте це:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

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

Для включення псевдонімів .bashrc використовуйте -icзамістьc


Помилка більше не з’являється, дякую. Але це дає мені bash: rails c: command not foundі "rails s" створює нову програму для рейків замість запуску сервера рейлів. Це змінює обсяг питання, я відредагую його з модифікацією
ури

Це спрацювало, якщо спробувати rails cна терміналі без нічого іншого? Можливо, так і має бути rails -c?
TuKsn

Спробував, що не вийшло. Я навіть спробував, rvm list gemsetsі він говорить No command 'rvm' found.. запустіть ту саму команду rvm list gemsetsна першій вкладці, яка відкривається без запуску команди, і вона працювала! чи виконує вона команду перед завантаженням середовища та завантаженням файлу .rvmrc?
Брарі

1

Аргумент, який ви надаєте опцію -e, "bash -c command; bash"включає цитати. Він інтерпретує цілий рядок як назву команди! Спробуйте замість цього: -e "bash -c 'command ; bash'". Таким чином, те, що запускається у вашому термінальному вікні command, і після цього запускається, ви отримуєте дочірню оболонку, яку, я вважаю, ви хочете. До речі, ви також можете сказати 'command & bash'; це запустить команду на задньому плані і негайно передасть вам дочку.


Я змінив це options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )в , options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )і він дав мені ту ж помилку .. я роблю це правильно?
Брарі

Не зовсім коректно: видалити \ "перед першим баштом та \" після "після другого баша.
Сільвіо Леві

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