I am doing a script that is installing ros and after installing it, compiling a workspace with catkin_make.
I found the solution to solve my problem but I can't explain the reason. I have a file called install.bash that is calling others:
#!/bin/bash
source 01_install_ros.bash
What is important is in 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 ""
As written in comments, sourcing .bashrc instead of directly setup.bash doesn't work. I really don't get why. Can you explain me?
Some platforms come with a ~/.bashrc
that has a conditional at the top that explicitly stops processing if the shell is found to be non-interactive - even though bash
only automatically sources ~/.bashrc
in interactive (non-login) sessions anyway.
For example, on Ubuntu 18.04:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
A similar test, seen in /etc/bash.bashrc
on the same platform:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
If this is the case, sourcing ~/.bashrc
from a script will have no effect, because scripts run in non-interactive shells by default.
Your options are:
Either: deactivate the conditional in ~/.bashrc
Or: Try to to emulate an interactive shell before invoking source ~/.bashrc
.
The specific emulation needed depends on the specifics of the conditional, but there are two likely approaches; you may have to employ them both if you don't know ahead of time which conditional you'll encounter:
set -i
temporarily to make $-
contain i
, indicating an interactive shell.~/.bashrc
using grep
, and then source the result with eval
(the latter should generally be avoided, but it in this case effectively provides the same functionality as sourcing).PS1
has a value is not enough, because Bash actively resets it in non-interactive shells - see this answer for background information.
eval "$(grep -vFx '[ -z "$PS1" ] && return' ~/.bashrc)"
Alternatively, if you control how your own script is invoked, you can invoke it with bash -i script
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With