我正在安装一个安装ros的脚本,安装完成后,使用catkin_make编译工作区。
我找到了解决问题的解决方案,但我无法解释原因。我有一个名为install.bash的文件正在调用其他人:
#!/bin/bash
source 01_install_ros.bash
重要的是01_install_ros.bash
:
# variable not set because it is done in the script setup.bash of ros
echo "before source in 01_install_ros"
echo "ROS_ROOT: "$ROS_ROOT
whereis catkin_make
echo ""
echo "source /opt/ros/kinetic/setup.bash" >> $HOME/.bashrc
# doesn't set the variables
source "$HOME"/.bashrc
# the solutions
source /opt/ros/kinetic/setup.bash
# variables not set if I use the source of .bashrc
echo "after source in 01_install_ros"
echo "ROS_ROOT: "$ROS_ROOT
whereis catkin_make
echo ""
正如在评论中所写,采购.bashrc而不是直接setup.bash不起作用。我真的不明白为什么。你能解释一下吗?
答案 0 :(得分:11)
某些平台附带~/.bashrc
,如果发现shell 非交互式,则在顶部有条件明确停止处理。 < / p>
如果是这种情况,从脚本中获取~/.bashrc
将无效,因为脚本在非交互式中运行>默认情况下的shell。
您的选项是:
要么:停用~/.bashrc
中的条件
或者:在调用source ~/.bashrc
之前尝试模拟交互式shell 。
所需的具体模拟取决于条件的具体情况,但有两种可能的方法;你可能不得不雇用他们两者如果你没有提前知道你会遇到哪些条件:
set -i
暂时使$-
包含i
,表示交互式shell。PS1
具有值。或者,如果您控制自己的脚本的调用方式,则可以使用bash -i script
调用它。