我有.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)"
答案 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它可以工作!