用于更改环境变量的Linux shell脚本

用于更改环境变量的Linux shell脚本,linux,shell,Linux,Shell,我正在尝试编写一个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

我正在尝试编写一个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


如何解决此问题?

如果您通过以下方式执行脚本,您想要的将不起作用:

bash script.sh  # won't work
或:

相反,您必须将其来源:

或者,如果您愿意:

source script.sh
问题是子shell不能改变父shell的环境。
export
命令适用于运行脚本及其子shell的shell,但不适用于其父shell。因此,命令必须在父shell中运行。这就是采购所做的

文档 采购记录在
man bash
中:

。文件名[参数]
来源文件名[参数]
在当前shell环境中读取并执行文件名中的命令,然后返回退出 从文件名执行的最后一个命令的状态。如果文件名是 不包含斜杠,路径中的文件名用于查找 包含文件名的目录。在路径中搜索的文件不需要 可以执行。当bash未处于posix模式时,当前目录 如果在路径中找不到文件,则搜索。如果sourcepath选项 shopt builtin命令已关闭,不会搜索路径。如果 如果提供了任何参数,它们将成为位置参数 当文件名被执行时。否则,位置参数为 不变。返回状态是最后一个退出命令的状态 在脚本中(如果未执行任何命令,则为0),如果 找不到或无法读取文件名。[重点补充]


如果通过以下方式执行脚本,则所需的将无法工作:

bash script.sh  # won't work
或:

相反,您必须将其来源:

或者,如果您愿意:

source script.sh
问题是子shell不能改变父shell的环境。
export
命令适用于运行脚本及其子shell的shell,但不适用于其父shell。因此,命令必须在父shell中运行。这就是采购所做的

文档 采购记录在
man bash
中:

。文件名[参数]
来源文件名[参数]
在当前shell环境中读取并执行文件名中的命令,然后返回退出 从文件名执行的最后一个命令的状态。如果文件名是 不包含斜杠,路径中的文件名用于查找 包含文件名的目录。在路径中搜索的文件不需要 可以执行。当bash未处于posix模式时,当前目录 如果在路径中找不到文件,则搜索。如果sourcepath选项 shopt builtin命令已关闭,不会搜索路径。如果 如果提供了任何参数,它们将成为位置参数 当文件名被执行时。否则,位置参数为 不变。返回状态是最后一个退出命令的状态 在脚本中(如果未执行任何命令,则为0),如果 找不到或无法读取文件名。[重点补充]


是否有办法将source script.sh放入实际脚本中?这样,我仍然可以运行命令。/script.sh。。。。。或者为它创建一个别名会更好吗?如果您在scriptB中生成scriptA,它将在scriptB的环境中运行。所以,不,那没用。但是,正如您所建议的,别名(或函数)可以工作。有没有办法将source script.sh放入实际脚本中?这样,我仍然可以运行命令。/script.sh。。。。。或者为它创建一个别名会更好吗?如果您在scriptB中生成scriptA,它将在scriptB的环境中运行。所以,不,那没用。不过,正如您所建议的,别名(或函数)可以工作。