我正在尝试编写一个Linux shell脚本来更改环境变量' ROS_IP'到我目前的IP地址。
printenv | grep "ROS_IP"
返回ROS_IP=192.168.1.10
命令
ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/'
返回我当前的IP地址192.168.1.2,这是正确的
这是我的shell脚本
#!/bin/bash
#Command to get current IP address and set the output to a variable 'var'
var=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')
#Make sure var is the correct IP
echo $var
#Set ROS_IP
export ROS_IP=$var
#end script
脚本运行后,运行命令
printenv | grep "ROS_IP"
仍会返回旧输出ROS_IP=192.168.1.10
如何解决此问题?
答案 0 :(得分:4)
如果你通过以下方式执行脚本,你想要的工作是什么?
bash script.sh # won't work
或者:
./script.sh # won't work even if script has executable bit set
相反,您必须源它:
. script.sh
或者,如果您愿意:
source script.sh
问题是子shell无法改变父shell的环境。 export
命令适用于运行脚本及其子shell的shell,但不其父shell。因此,命令必须在父shell中运行。这就是采购的目的。
采购记录在man bash
:
。 filename [arguments]
来源文件名[参数]
从当前shell环境中的文件名读取并执行命令并返回退出 从filename执行的最后一个命令的状态。如果文件名 不包含斜杠,PATH中的文件名用于查找 目录包含文件名。在PATH中搜索的文件不需要 可执行的。当bash不处于posix模式时,当前目录 如果在PATH中找不到文件,则搜索。如果是sourcepath选项的话 shopt builtin命令关闭,不搜索PATH。如果 提供任何参数,它们成为位置参数 当执行文件名时。否则位置参数是 不变。返回状态是退出的最后一个命令的状态 在脚本中(如果没有执行任何命令,则为0),如果是,则为false 找不到或无法读取文件名。 [强调补充]