Открытие нового gnome-терминала (v3.28+) с несколькими вкладками и различными командами

Похоже, у вас проблемы с массивами $ {team_two [*]} и $ {team_two [k1]} , либо вы испортили символы разделения в специальная переменная $ IFS . Вы можете включить отладку Bash, добавив set -x перед входом во внешний цикл for. А затем отключите его с помощью set + x , чтобы получить более подробные сведения.

set -x
... for loop block ...
set +x

Пример

Когда я запускаю ваш код через Bash таким образом, я получаю следующий результат:

$ bash -x for.bash 
++ seq 1 5
+ for i1 in '`seq 1 5`'
+ num1=2
++ seq 2 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=1
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=2
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=3
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=4
+ for i1 in '`seq 1 5`'
+ num1=3
++ seq 3 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=6
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=7
+ for i1 in '`seq 1 5`'
+ num1=4
++ seq 4 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=8
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=9
+ for i1 in '`seq 1 5`'
+ num1=5
++ seq 5 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=10
+ for i1 in '`seq 1 5`'
+ num1=6
++ seq 6 5

Edit # 1

После дальнейших обновлений будет казаться, что вы сбросили $ IFS . Обычно вы хотите сохранить $ IFS во вторичной переменной перед ее сбросом, а позже вернуть ее к исходному значению.

IFSOLD=$IFS
IFS=,

... do IFS , stuff here ...

IFS=$IFSOLD

IFS

Если вы попробуете эти примеры, они могут пролить дополнительный свет на влияние, которое $ IFS может сыграть при использовании в скрипте.

Допустим, у меня есть следующая переменная:

$ var="1,2,3,4,5"

Теперь давайте проанализируем ее и распечатаем первую переменную, $ c1 :

$ IFS=',' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1

Однако если мы изменим наш $ IFS на космос.

$ IFS=' ' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1,2,3,4,5

Итак, во втором примере мы настроили команду read через $ IFS для разделения по пробелам, а не по запятым.

1
05.01.2019, 15:50
4 ответа

У меня была такая же проблема, и после огромного количества попыток я нашел следующее решение

gnome-terminal -- bash -c "myCommand -some-args; bash"
gnome-terminal -- bash -c "myOtherCommand -some-args; bash"
3
28.01.2020, 00:21

Лучший способ, ИМХО, это забыть о терминале gnome -. Вместо этого установите терминал mate -, который является клоном старого терминала gnome -, и он сохраняет такие полезные функции, как возможность называть вкладки...
Вот мой сценарий запуска, который создает три именованные вкладки, каждая из которых может находиться в разных каталогах...

#!/bin/bash
mate-terminal \
--hide-menubar \
--geometry=130x12+1+800 \
--tab -t "vpn" \
    --tab -t "home" \
    --tab --working-directory="/ddr/buppo/bw/bw-b/sn" -t "sn"
0
09.11.2020, 16:15

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

Где-то на своем пути я создаю исполняемый launch_project_fooскрипт.Типичный файл запуска проекта может выглядеть как:

#!/bin/bash

BASE_DIR=~/git/ProjectFooBaseDir

cat << EOF > /tmp/bootstrap_tabs.sh
gnome-terminal --tab -t "Docker" --working-directory="$BASE_DIR/backend" -- \
  zsh -is eval "docker-compose up"
gnome-terminal --tab -t "Backend" --working-directory="$BASE_DIR/backend" -- \
  zsh -is eval "npm start"
gnome-terminal --tab -t "Frontend" --working-directory="$BASE_DIR/frontend" -- \
  zsh -is eval "npm start"
gnome-terminal --tab -t "Git" --working-directory="$BASE_DIR"
EOF

gnome-terminal --window --maximize -- bash /tmp/bootstrap_tabs.sh

Важно :Это зависит от наличия ловушки eval в .zshrc, как объяснено ниже.

Несколько замечаний:

  • Основной вызов gnome-terminalфактически создает «нулевую» вкладку для начальной загрузки, но, поскольку она сразу же закрывается, это не заметно. Если вы поместите сон в сценарий начальной загрузки, вы поймете, что я имею в виду.

  • Чтобы разрешить подстановку переменных, в heredoc не должны использоваться заключенные в кавычки 'EOF', см. использование переменных внутри bash heredoc .

  • Последняя вкладка создает обычный терминал для нормальной работы.

  • Другие вкладки не запускают процессы напрямую, потому что это будет означать, что если процесс завершится, вкладка исчезнет. Решение этой проблемы несколько специфично для оболочки. Здесь я использую zsh и полагаюсь на наличие хука eval в .zshrc. Можно избежать хука eval и просто использовать, например. zsh -ic "<commands>; zsh -i". Однако у этого есть недостаток, заключающийся в том, что при уничтожении команд с помощью CTRL + C(, что характерно для бесконечно работающих команд, таких как npm start), вся вкладка будет закрыта, потому что экземпляр внешней оболочки завершает работу. Подход с хуком eval позволяет избежать этого и позволяет держать вкладки открытыми даже в случае SIGTERM.

  • Команды могут быть объединены в цепочку, как обычно, и на практике я часто использую sleep 10; npm start;, чтобы дождаться готовности чего-то с другой вкладки (, например docker -compose ).

0
04.03.2021, 09:37

открывает несколько вкладок. я думаю, что будет чище держать каждую вкладку на отдельной строке. если вы хотите новое окно для каждого, опустите--tab

обратите внимание, что большая разница с --по сравнению с -e/ --commandзаключается в том, что аргументы не заключены в кавычки

gnome-terminal --title "Frontend Web App" --tab --working-directory ~/projects/front-end-app -- npm run serve
gnome-terminal --title "API Server" --tab --working-directory ~/projects/api-server --./run-local.sh
0
08.06.2021, 19:21

Теги

Похожие вопросы