Часть 08: выполнение команд по SSH и вставка целым блоком
Эта глава решает одну конкретную, но очень путающую новичков задачу: почему один и тот же набор команд при вставке целым блоком не работает, а при построчном выполнении — работает. Особенно часто это проявляется в командах запуска ROS2 на Magicbox, где есть sudo su -, source и ros2 launch: все три типа команд очень чувствительны к текущей оболочке.
1. Главный вывод
Если в наборе команд есть sudo su -, не вставляйте её вместе со всеми следующими командами одним блоком. Надёжнее сделать одно из двух.
Первый способ: сначала выполнить отдельно
sudo su -
и только убедившись, что приглашение сменилось на root, вставлять остальные команды.
Второй способ: вообще не переключать оболочку интерактивно, а обернуть весь набор в один sudo bash -lc '...'. Для команд, которые часто копируются и выполняются удалённо, это обычно предпочтительный вариант.
2. Почему блок не работает
Причина не в самой плате, а в переключении оболочки.
sudo su - не просто повышает права, а запускает новую оболочку входа под root. Новая оболочка заново загружает собственное окружение и берёт на себя ввод последующих команд. Проблема в том, что многие терминалы Windows, SSH-клиенты и веб-терминалы при вставке блока отправляют следующие строки очень быстро. В результате последующие команды не обязательно попадают в ту оболочку, которую вы имели в виду.
Чаще всего это проявляется тремя способами.
Первый: часть команд выполняется в старой оболочке, а часть — в новой.
Второй: source /opt/tros/humble/setup.bash подействовал в одной оболочке, а ros2 launch запустился уже в другой.
Третий: сама команда написана верно, но окружение не сохранилось полностью, поэтому кажется, что «всё молчит» или ros2 не найден.
Поэтому возникает эффект, похожий на мистику: построчно всё работает, а блоком — нет.
3. Какие команды чаще всего страдают
В учебнике чаще всего страдают три группы команд.
Первая группа — команды, которые меняют оболочку:
sudo su -
sudo -i
Вторая группа — команды, действующие только в текущей оболочке:
source /opt/tros/humble/setup.bash
source /userdata/magicbox/app/ros_ws/install/local_setup.bash
export ROS_LOG_DIR=/userdata/magicbox/log
Третья группа — команды, которые зависят от результатов первых двух:
ros2 launch gesture_interaction gesture_interaction.launch.py
ros2 launch hobot_stereonet stereonet_model_web_visual_v2.4_int16.launch.py
Поэтому если в одном блоке есть переключение оболочки, source окружения и запуск ros2, такой блок нельзя считать безусловно пригодным для вставки целиком.
4. Какой способ выполнения рекомендуется в учебнике
При ручной отладке рекомендуется двухэтапный способ.
Первый этап — сначала войти в root отдельно:
sudo su -
Второй этап — затем выполнить собственно команду запуска. Например, для жестового взаимодействия:
cd /userdata/magicbox
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export LD_LIBRARY_PATH=/userdata/magicbox/app/ros_ws/install/qwen_llm/lib:$LD_LIBRARY_PATH
export HOME=/userdata/magicbox
export ROS_LOG_DIR=/userdata/magicbox/log
mkdir -p /userdata/magicbox/log
source /opt/tros/humble/setup.bash
source /userdata/magicbox/app/ros_ws/install/local_setup.bash
ros2 launch gesture_interaction gesture_interaction.launch.py
Если одну и ту же команду приходится копировать многократно, удобнее «одношаговый» вариант — одна команда, которая целиком выполняется в одной оболочке root:
sudo bash -lc '
cd /userdata/magicbox
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export LD_LIBRARY_PATH=/userdata/magicbox/app/ros_ws/install/qwen_llm/lib:$LD_LIBRARY_PATH
export HOME=/userdata/magicbox
export ROS_LOG_DIR=/userdata/magicbox/log
mkdir -p /userdata/magicbox/log
source /opt/tros/humble/setup.bash
source /userdata/magicbox/app/ros_ws/install/local_setup.bash
exec ros2 launch gesture_interaction gesture_interaction.launch.py
'
Преимущество такой записи в том, что все действия происходят в одной и той же оболочке root, поэтому не возникает ситуации «окружение, которое мы выставили раньше, осталось в другой оболочке».
5. Что проверить, если уже не сработало
Не спешите винить репозиторий или файл запуска. Сначала проверьте, сохранилось ли в текущей оболочке нужное окружение.
Проверка, доступен ли ros2 в текущем PATH:
command -v ros2
Если вывода нет, значит, в текущей оболочке полное окружение ROS2 не загружено.
Далее проверьте, доступны ли для записи ключевые каталоги журналов:
ls -ld /userdata/magicbox/log /userdata/.roslog
Если права каталогов неверны, даже при наличии команды ros2 launch запуск может завершиться ещё до старта, потому что не удаётся создать каталог журналов.
6. Где ещё действует это правило
Это правило относится не только к жестовому взаимодействию. Все команды учебника, которые имеют структуру
sudo / оболочка root
-> source окружения ROS2
-> source окружения рабочей области
-> ros2 launch
нужно выполнять по тем же принципам. Поэтому и бинокулярная демонстрация из четвёртой главы, и жестовое взаимодействие, и любое другое приложение ROS2, которому нужны права root, следуют одному и тому же правилу выполнения.
7. Что читатель должен вынести из главы
После этой главы читатель должен чётко понимать три вещи.
Первое: если блок команд, который вставлен целиком, не работает, а построчно выполняется нормально, то причина, скорее всего, не в плате «капризничает», а в смене оболочки и наследовании окружения.
Второе: если в команде есть sudo su -, source и ros2 launch, всегда нужно проверять, выполняются ли они в одной и той же оболочке.
Третье: для многократно повторяемых команд удобнее использовать одну команду sudo bash -lc '...', которая выполняет всё в одной оболочке.