Открытие нескольких вкладок терминала и запуск команды

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 \ "") из команды, он откроет вкладки в указанном каталоге и назовет их без ошибок.

-Edit-1:

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

Brary
источник
Если вы хотите, чтобы ваш скрипт запускался при загрузке Ubuntu: - вы можете запустить ваш скрипт как сервис upstart ( 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(замените yourLayout на то, что вы выбрали на шаге 2).

  5. (необязательно) Отредактируйте ~/.config/terminator/configфайл так, чтобы там, где он написан и находился[layouts] под ним [[yourLayout]], переименуйте yourLayout в default и удалите / переименуйте предыдущий макет по умолчанию . Теперь, когда 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.`Use“ - ”завершает опции и помещает командную строку для выполнения после нее. . that's an output but the comands get executed. When i use $ tab - `команда не выполняется и выводится сообщение терминала: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\"" ) 

в противном случае все выражение после -e будет интерпретировано как команда.

Чтобы включить псевдонимы из .bashrc использовать -icвместоc

TuKsn
источник
Ошибка больше не появляется, спасибо. Но это дает мне, bash: rails c: command not foundи 'rails s' создает новое приложение rails вместо запуска сервера rails. Это меняет
суть
Сработало ли, если вы попробуете rails cна терминале без чего-либо еще? Возможно, так и должно быть rails -c?
ТуКсн
Пробовал, что не сработало. Я даже пытался, rvm list gemsetsи он говорит No command 'rvm' found.. запустить ту же команду rvm list gemsetsв первой вкладке, которая открывается без запуска команды, и это сработало! запускает ли команда до загрузки среды и загрузки файла .rvmrc?
Brary
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'\"" )и это дало мне ту же ошибку .. я делаю это правильно?
Brary
Не совсем правильно: удалить \ "до первого bash и \" после "после второго bash.
Сильвио Леви
Спасибо, я отредактировал вопрос и изменил сферу его охвата, чтобы включить rails и rvm.
Brary