【问题标题】:Source files in a bash scriptbash 脚本中的源文件
【发布时间】:2013-04-07 08:02:37
【问题描述】:

我正在使用相邻的两个版本的 ROS。要使用一个,我必须为特定版本获取一些环境变量。我想创建一个执行此操作的脚本。 但是如果我创建一个像下面这样的脚本没有设置变量,它们可能设置在一个子shell中。如何将文件源到主终端外壳?

source.sh:

source /opt/ros/fuerte/setup.bash;
source  ~/fuerte_workspace/setup.bash;

这是我调用 source.sh 的方式:

./source.sh
# This does not echo anything, but I expect it should
echo $ros_config

更新:通过按照答案中的建议采购 source.sh,我现在可以看到正在设置的变量。

source ./source.sh
# This works now
echo $ros_config

【问题讨论】:

标签: bash shell ubuntu


【解决方案1】:

使用 . ./(点空间点斜线)

在使用“dot space dot slash”执行shell脚本时,如下图所示,它将在当前shell中执行脚本,而不会派生子shell。

$ . ./setup.bash

也就是说,这会在当前shell中执行setup.bash中指定的命令,并为你准备好环境。

【讨论】:

  • .source 的别名,以空格分隔(与所有 bash 命令一样)。如果您使用source,您将避免与使用. 表示当前目录等相关的常见错误。
  • 注意:source. 的别名,而不是相反。
  • 这适用于当前目录中的脚本 - 但是如果脚本位于 /usr/local/bin 中,你会怎么做?这样更方便,因为您不必 cd 到脚本所在的目录。
【解决方案2】:

当前 shell 的脚本文件中使用点表示法,即不创建子shell

. /opt/ros/fuerte/setup.bash
. ~/fuerte_workspace/setup.bash

【讨论】:

  • 如果我使用 ./source.sh 它不起作用。 source source.sh 确实有效!
  • 因为您在此处提供 setup.sh 的完整路径,因此不需要 ./,因为 ./ 表示当前目录。
  • "./source.sh" 执行脚本(在它自己的 shell 中)。 “. ./source.sh”(或“source ./source.sh”或“source source.sh”)会将脚本内容应用到当前的 shell 环境。
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多