Linux shell脚本更改环境变量

时间:2015-11-19 00:18:09

标签: 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 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

如何解决此问题?

1 个答案:

答案 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   找不到或无法读取文件名。 [强调补充]