bash 脚本中的源文件

Posted

技术标签:

【中文标题】bash 脚本中的源文件【英文标题】:Source files in a bash script 【发布时间】: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

【问题讨论】:

采购source.sh 怎么样?这可以帮助你:***.com/a/15968190/1983854 【参考方案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 环境。

以上是关于bash 脚本中的源文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 heredoc 写入 Bash 脚本中的文件?

带有 bash 替换的文件中的 SQLplus 脚本

通过 SSH 执行存储在文件中的 Bash 脚本

Bash - 从与脚本文件位于同一目录中的文件读取

用 Bash 脚本中的 sed 替换文件中的版本号

有没有办法运行来自 bash 的 zip 文件中的 python 脚本?