我正在做一个安装 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不起作用。我真的不明白为什么。你能给我解释一下吗?
一些平台带有一个~/. bashrc
,它在顶部有一个条件,如果发现shell是非交互式的,它会显式停止处理-即使bash
无论如何只会在交互式(非登录)会话中自动生成~/. bashrc
。
例如,在 Ubuntu 18.04 上:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
在同一平台上的/etc/bash.bashrc
中可以看到类似的测试:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
如果是这种情况,sourcing ~/。bashrc
不会有任何效果,因为脚本默认在非交互式shells中运行。
您的选择是:
> < li>
任一:取消激活< code>~/中的条件。bashrc
或者:尝试在调用源代码 ~/.bashrc
之前模拟交互式 shell。
所需的特定仿真取决于条件的具体情况,但有两种可能的方法;如果您事先不知道会遇到哪种条件,则可能必须同时使用它们:
临时设置-i
,使< code>$-包含< code>i,表示一个交互式shell。
< li >如果您知道执行交互性测试的行的内容,请将其从< code>~/中筛选出来。bashrc使用< code>grep,然后使用< code>eval获取结果(通常应避免后者,但在这种情况下,它有效地提供了与获取相同的功能)。< br >注意,确保环境变量< code>PS1有一个值是不够的,因为Bash会在非交互式shells中主动重置它——有关背景信息,请参阅此答案。
< ul >
< Li > < code > eval " $(grep-vFx '[-z " $ PS1 "]或者,如果您控制如何调用您自己的脚本,您可以使用< br>bash -i script
来调用它。