Linux源代码在.sh文件中不起作用?

时间:2013-08-14 13:36:25

标签: bash sh

我有.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)"

3 个答案:

答案 0 :(得分:6)

您正在<{1}}中设置ROBOT变量,但 可用于父进程(您的产生shell /命令 - 提示)。

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

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

答案 1 :(得分:3)

正如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

答案 2 :(得分:0)

我在Ubuntu 16.04上

我使用/ bin / sh而不是/ bin / bash它可以工作!