提问者:小点点

来源。脚本中的bashrc不起作用


我正在做一个安装 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不起作用。我真的不明白为什么。你能给我解释一下吗?


共1个答案

匿名用户

一些平台带有一个~/. 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。
所需的特定仿真取决于条件的具体情况,但有两种可能的方法;如果您事先不知道会遇到哪种条件,则可能必须同时使用它们:

    < li>临时设置-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来调用它。