Вопрос или проблема
Я пытался написать shell-скрипт для выполнения нескольких команд в нескольких терминалах, но не смог запустить команды. Я могу только открывать несколько терминалов.
Это написано в shell-скрипте sitl.sh
:
#!/bin/bash
gnome-terminal --working-directory=/home/mit/catkin_ws/ && roslaunch iq_sim iris.launch && rosrun iq_gnc square
gnome-terminal --working-directory=/home/mit/ardupilot/ArduCopter/
gnome-terminal --working-directory=/home/mit/catkin_ws/
gnome-terminal --working-directory=/home/mit/catkin_ws/ && roslaunch iq_sim lidar.launch
Если я запускаю этот скрипт, команды выполняются в одном и том же терминале. Если я завершаю первую команду, следующая команда запускается, если я завершаю вторую команду, третья команда запускается. Мне нужно запускать все команды одновременно. Я хочу, чтобы каждая команда выполнялась в отдельном окне терминала одновременно, используя одну команду shell-скрипта. Пожалуйста, помогите мне решить эту проблему.
Моя цель состоит в том, чтобы запускать несколько команд, команды должны выполняться отдельно в каждом терминале одновременно, мне не нужно завершать первую команду, чтобы вторая команда работала.
Пожалуйста, помогите мне, друзья, решить мою проблему.
Вы должны использовать опцию -e
или -x
для gnome-terminal
. Согласно man gnome-terminal
:
-e, --command=STRING
Выполнить аргумент этой опции внутри терминала.
-x, --execute
Выполнить оставшуюся часть командной строки внутри терминала.
Ответ или решение
Чтобы решить задачу запуска нескольких команд в отдельных окнах терминала при помощи одного сценария Shell, необходимо точно понимать, как именно работает выполнение команд в Linux через терминал. Проблема, описанная в вашем случае, заключается в том, что команды выполняются последовательно в одном потоке, поэтому они не исполняются одновременно в отдельных окнах.
Теория
Основная задача заключается в том, чтобы запускать команды параллельно в отдельных оболочках терминала и одновременно. В данной ситуации используется gnome-terminal
, который поддерживает выполнение команд через аргументы командной строки. Ключевой момент здесь — использовать флаги -e
или -x
, которые дают возможность выполнять конкретную команду или программу в каждом новом открываемом окне терминала.
Пример
Рассмотрим, как можно переписать ваш сценарий, чтобы достичь желаемого результата. Мы будем использовать флаг -e
или -x
для gnome-terminal
, чтобы каждая команда запускалась сразу в новом окне:
#!/bin/bash
# Запуск первой команды в новом окне терминала
gnome-terminal --working-directory=/home/mit/catkin_ws/ -e "bash -c 'roslaunch iq_sim iris.launch; exec bash'"
# Запуск второй команды в новом окне терминала
gnome-terminal --working-directory=/home/mit/ardupilot/ArduCopter/ -e "bash -c 'rosrun iq_gnc square; exec bash'"
# Запуск третьей команды в новом окне терминала
gnome-terminal --working-directory=/home/mit/catkin_ws/ -e "bash -c 'roslaunch iq_sim lidar.launch; exec bash'"
Применение
-
Использование
-e
или-x
: Аргументы-e
или-x
позволяют задавать команду, которая должна выполняться внутри нового окна терминала. Важно отметить, что после исполнения команды терминал не закроется автоматически, благодаряexec bash
. Это обеспечивает возможность просмотреть вывод команды и любые ошибки. -
Команды в кавычках: В каждой из команд используется конструкция
bash -c '<command>'; exec bash'
, где<command>
представляет собой команду, которую вы хотите выполнить в новом окне терминала. -
Конструкция
exec bash
: Это позволяет терминалу оставаться открытым после выполнения указанной команды, что полезно для отладки и мониторинга выполнения команды.
Дополнительные советы
-
Проверка установленных терминалов: Убедитесь, что
gnome-terminal
установлен на вашей системе. Некоторые системы могут использовать другие терминальные эмуляторы, такие какkonsole
илиxfce4-terminal
. В этом случае вам нужно будет отрегулировать параметры вызова. -
Обработка ошибок: Чтобы сделать ваш скрипт более устойчивым к ошибкам, вы можете добавить проверку успешности выполнения команд с помощью оператора
||
. Например,roslaunch iq_sim iris.launch || echo 'Failed to launch iris'
позволит зафиксировать точку выхода в случае неудачи. -
Логирование: Для более сложных сценариев, можно добавить функциональность логирования, чтобы запись вывода и ошибок всех запущенных процессов сохранялась в отдельные файлы журнала.
Таким образом, с помощью модифицированного сценария, описанного выше, вы сможете запускать несколько команд в отдельных окнах терминала одновременно, что соответствует вашим требованиям. Если у вас появятся дополнительные вопросы или понадобится помощь в адаптации сценария, не стесняйтесь обращаться за помощью.