我遇到的问题是我的shell脚本与我手动输入控制台的行为完全不同。我试图在shell脚本中找到并获取一些安装文件,如下所示:
#!/bin/bash
TURTLE_SHELL=bash
# source setup.sh from same directory as this file
_TURTLE_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)
. "$_TURTLE_SETUP_DIR/turtle_setup.sh"
此bash文件调用.sh文件:
#!/bin/env sh
_TURTLE_ROS_SETUP_DIR=$_TURTLE_SETUP_DIR/../devel
if [ -z "$TURTLE_SHELL" ]; then
TURTLE_SHELL=sh
fi
if [ -d "$PX4_FIRMWARE_DIR/integrationtests" ]; then
if [ -f "$PX4_FIRMWARE_DIR/integrationtests/setup_gazebo_ros.bash" ]; then
. "$PX4_FIRMWARE_DIR/integrationtests/setup_gazebo_ros.bash" "$PX4_FIRMWARE_DIR"
fi
fi
if [ "$TURTLE_SHELL" = "bash" ]; then
if [ -f "$_TURTLE_ROS_SETUP_DIR/setup.bash" ]; then
source $_TURTLE_ROS_SETUP_DIR/setup.bash
fi
else
if [ "$TURTLE_SHELL" = "sh" ]; then
if [ -f "$_TURTLE_ROS_SETUP_DIR/setup.sh" ]; then
source $_TURTLE_ROS_SETUP_DIR/setup.sh
fi
fi
fi
有问题的一行是:
. "$PX4_FIRMWARE_DIR/integrationtests/setup_gazebo_ros.bash" "$PX4_FIRMWARE_DIR"
我已确保此代码实际正在运行且我的环境变量是正确的。如果我在命令行上运行此命令一切正常。但是,当文件来源于shell脚本时,情况并非如此。为什么是这样?是否存在与命令行不同的shell脚本环境的不同之处。另外,我该如何解决这个问题?
编辑: 我采购 .bash或.sh比例,具体取决于我使用的是哪个shell。
编辑2: 我采购这个脚本。因此,所有内容都在我的默认bash终端中运行,并且它都在同一终端内运行,并且不从子进程生成的终端。为什么脚本不在当前shell中获取setup_gazebo_ros.bash?
答案 0 :(得分:2)
这与您获取env脚本并且不运行它的原因相同。当您运行脚本时,它将在新shell中运行,并且变量不会传输回父shell。
说明
$ cat << ! > foo.sh
> export foo='FOO'
> !
$ chmod +x foo.sh
$ ./foo.sh
$ echo $foo
$ source ./foo.sh
$ echo $foo
FOO