用于更改环境变量的Linux shell脚本
我正在尝试编写一个Linux shell脚本,将环境变量“ROS_IP”更改为我的当前IP地址用于更改环境变量的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
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的环境中运行。所以,不,那没用。不过,正如您所建议的,别名(或函数)可以工作。