2

我有一个 .sh ( start_sim.sh) 和一个 .bash ( sim_sources.bash) 文件。该sim_sources.bash文件是从内部调用的,start_sim.sh并且应该将环境变量设置$ROBOT为某个值。但是,ROBOT当我调用./start_sim.sh. 我尝试这样做的方式是否存在根本性错误?

start_sim.sh包含:

#!/bin/bash

echo -n "sourcing sim_sources.bash..."
source /home/.../sim_sources.bash
echo "done."

sim_sources.bash包含:

# set the robot id
export ROBOT=robot

编辑:您能否提出一种解决此问题的方法?我仍然需要在 .bash 文件中设置变量。

EDIT2:感谢您的回复!最后我最终用一个屏幕和填充命令来解决它:

echo -n "starting screen..."
screen -dmS "sim_screen"
sleep 2
screen -S "sim_screen" -p 0 -X stuff "source /home/.../sim_sources.bash$(printf \\r)"
sleep 5
screen -S "sim_screen" -p 0 -X stuff "source /home/.../start_sim.sh$(printf \\r)"
4

3 回答 3

6

您在 中设置变量ROBOT但这start_sim.sh script对父进程(您的生成 shell/命令提示符)不可用。

导出变量,例如export ROBOT=robot使变量可用于当前进程和子进程。当您调用时,./start_sim.sh您正在调用一个新进程。

如果您只是source start_sim.sh在您的 shell 中,该脚本将作为您的 shell 进程的一部分运行,然后您的变量将可用。

于 2013-08-14T13:38:39.853 回答
4

正如 Brian 指出的那样,这些变量在脚本之外不可用。

这是一个显示这一点的改编脚本:

#!/bin/bash

echo -n "sourcing sim_sources.bash..."
. sim_sources.bash
echo $ROBOT
echo "done."

您要求的解决方法是从已设置环境值的实际 shell 启动一个新 shell:

#!/bin/bash

echo -n "sourcing sim_sources.bash..."
. sim_sources.bash
echo "done."
bash

这导致:

bash-4.1$ printenv | grep ROBOT
ROBOT=robot
于 2013-08-14T13:53:35.990 回答
0

我在 Ubuntu 16.04

我使用 /bin/sh 而不是 /bin/bash 并且它有效!

于 2018-04-18T05:56:35.040 回答