在shell脚本中获取文件与在命令行上获取源文件

时间:2016-05-15 01:09:49

标签: linux bash shell environment

我遇到的问题是我的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?

1 个答案:

答案 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