【linux】linux环境变量|删除|添加|shell父子环境变量传递

34 篇文章 20 订阅

目录

查看环境变量

设置临时环境变量

设置环境变量永久的--针对具体的用户

设置环境变量永久的--针对所有用户

删除环境变量

Linux export命令参数

profile和bashrc, ~/.profile ,~/.bashrc

shell父子环境变量传递


查看环境变量

printenv或env

coreutils包中包含printenv和env。yum -y install coreutils

设置临时环境变量

export PATH="${PATH}:/root/testPath"

export命令来设置临时环境变量,这个变量是只存在于设定环境变量的会话中,其它会话窗口是不会有该变量的,一旦会话结束或者会话退出,重新连接会话,该环境变量就不存在了

设置环境变量永久的--针对具体的用户

在 ~/profile、~/.bash_profile、~/.bash_login 或 ~/.bash_logout 中添加。如

[root@sharplee ~]# vi ~/.bash_profile

编辑完成之后,执行"source ~/.bash_profile"使其立马生效。(修改完后务必执行:source /etc/profile    使修改的内容生效

设置环境变量永久的--针对所有用户

在系统上定义全局环境变量:/etc/profile、/etc/bash.bashrc 和 /etc/environment。/etc/profile.d目录用于定义全局脚本。下面就在/etc/profile.d目录下创建一个全局脚本,启动时就会运行该脚本。接着在/etc/profile中添加一个“export PATH="${PATH}:/root/testPath“”命令,即可在任何用户下都能执行该脚本了。

[root@liyao ~]# vi /etc/profile

export PATH=$PATH:/usr/local/mysql/bin  # 在配置文件中加入此行配置

修改完后务必执行:source /etc/profile    使修改的内容生效

Linux如何设置环境变量

删除环境变量

Linux export命令参数

语  法:export [-fnp][变量名称]=[变量设置值]

参  数:

-f  代表[变量名称]中为函数名称。

-n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。

-p  列出所有的shell赋予程序的环境变量。

一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。

export命令可以用于传递一个或多个变量的值到任何后继脚本

profile和bashrc, ~/.profile ,~/.bashrc

(1) profile和bashrc

影响范围什么时候加载
/etc/profile系统系统登录后
~/.profile用户启动bash shell,
/etc/bash.bashrc系统系统登录后
~/.bashrc用户每次启动bash shell

配置环境变量一般在这两种文件中。先讲讲什么时候执行,后面再介绍这两种文件做了什么。

profile在系统登录后执行,只在登录系统时执行一次,包括针对系统的/etc/profile和针对用户的~/.profile。

bashrc在每次启动bash shell(打开终端或者在终端输入sh)后执行,包括针对系统的/etc/bash.bashrc和针对用户的~/.bashrc(这里注意一下我的ubuntu里是/etc/bash.bashrc,其它系统可能是/etc/bashrc)

cat /etc/profile
cat /etc/bash.bashrc
cat ~/.profile
cat ~/.bashrc
https://www.cnblogs.com/liaohuiqiang/p/7197581.html?utm_source=itdadao&utm_medium=referral

 
原文链接:https://blog.csdn.net/bandaoyu/article/details/103459252

shell父子环境变量传递

(摘自:http://t.csdn.cn/gHnqC

当我们在一个 shell 里运行一个脚本程序时,该 shell 就会 fork 出一个新进程,从而启动了另一个命令解释器(由脚本中第一行的 #!/bin/xxx 指定,如 bash shell)来解释运行我们这个脚本。也就是说,这个新进程是一个子 shell,而之前的 shell 是个父 shell 。

在我们所运行的脚本里,我们还可以启动新的子 shell 进程,这些子 shell 进程使脚本并行地运行着多个子任务。一般而言,在一个脚本里执行一个外部命令(普通的可执行文件)时,shell 会 fork 出一个子进程,然后再用 exec 来执行这个程序;但是,bash shell 的内置命令(builtin)却不会这样,它们是直接执行的。所以,等价的内置命令的执行速度会比执行外部命令要来的快。

在一对括号 (...) 里可以放置一组指令,这些指令是在一个子 shell 里执行的。在子 shell 里的变量不能被这段子 shell 外的代码直接访问,也就是说子 shell 里的变量不能被父 shell 所存取,实际上它们是局部变量。这里可以参考:Link (( ))和 [[ ]]Link shell 与 命令的执行 这两篇文章。

下面用一段代码进行测试:

#!/bin/bash

echo "Subshell level = $BASH_SUBSHELL"

outer_variable=Outer
outer_variable2=Outer2

(
 echo "Subshell level INSIDE subshell = $BASH_SUBSHELL"
 inner_variable=Inner
 outer_variable2=Outer_var_changein_subshell
 echo "From Subshell,\"inner_variable\"=$inner_variable"
 echo "From parent shell,\"outer\"=$outer_variable"
 echo "From parent shell, \"outer\"=$outer_variable2"
)

echo "In parent shell, check \"outer_variable\" value:$outer_variable"
echo "In parent shell, check \"outer_variable2\" value:$outer_variable2"

echo
echo "Subshell level OUTSIDE subshell = $BASH_SUBSHELL"
echo

if [ -z "$inner_variable" ]
then
    echo "inner_variable undefined in main body of shell"
else
    echo "From main body of shell,\"inner_variable\"=$inner_variable"
fi

exit 0

运行输出:

beyes@debian:~/shell$ ./subshell.sh
Subshell level = 0
Subshell level INSIDE subshell = 1
From Subshell,"inner_variable"=Inner
From parent shell,"outer"=Outer
From parent shell, "outer"=Outer_var_changein_subshell
In parent shell, check "outer_variable" value:Outer
In parent shell, check "outer_variable2" value:Outer2
Subshell level OUTSIDE subshell = 0
inner_variable undefined in main body of shell

在上面的代码中,BASH_SUBSHELL 是一个环境变量,它表示进入子 shell 的层级,比如处于当前 shell 时,该变量值为 0;当在当前 shell 派生的子 shell 里时,该变量值为 1;如果该子 shell 又派生出一个子 shell,那么该变量在此间的值就为 3,以此类推。

在代码中,( ) 里的代码段是在子 shell 里执行的,而 inner_variable 作为局部变量,它的值可以在 ( ) 这段代码里 echo 出来,但是一旦返回到父shell 时,它就是未定义的,所以会输出“ inner_variable undefined in main body of shell”。也就是说,局部变量不能被外部代码所访问。

从输出可以看到,在子 shell 中和父 shell 中变量 outer_variable 的输出值是一样的;相对应的 outer_variable2 变量即使在子 shell 中进行了修改,但是当返回到父 shell 对其输出时,它却还是父 shell 中原来所赋的值。从这里可以看出,子 shell 可以 “感知” 父 shell 中的变量,但它不能修改它。其本质的原因和 fork() 函数的原理有关。在 UNIX/LINUX 中,fork 出来的子进程实际上是对父进程的一种拷贝,而子 shell 就是父shell fork 出来的一个子进程,所以它理所当然的有了父shell 中的一片拷贝。所以,子 shell 里的 outer_variable 和 outer_variable2 变量虽然和父 shell 的同名,但它们并不是同一个变量,而是父 shell 里的一个副本。

说到父shell 和 子 shell,那么会想到 export 这个命令。export 也是 bash 的一个内置命令。它主要是用来将父 shell 里的变量导出供子 shell 使用。它有如下特征:1. 用 export 导出的变量放在“导出变量列表”中,它可以被子 shell (子 shell 的子 shell 也是如此)拷贝并使用。2. 被 export 出来的变量虽然可以被子 shell 使用,但它也只是一个拷贝,而不会影响到父 shell 中的值以及其它子 shell 中的值。

看下面示例;

  1. 先在当前 shell 里 export 一个变量:

    beyes@debian:~/shell$ export exp8temp="hello world"
    beyes@debian:~/shell$ echo $exp8temp
    hello world
    
  2. 运行一个脚本 echo 此变量(该脚本只有一句话即 echo $exp8temp ):

    $ ./exp8.sh
    hello world
    

由上可见,父 shell 里 export 的变量可以被子 shell 读取。

  1. 测试一下子 shell 更改此变量是否会影响父 shell 里的值,子 shell 代码如下:

    #!/bin/bash
    exp8temp="hello shell"
    echo $exp8temp
    

检验上面的情景:

beyes@debian:~/shell$ ./exp8.sh
hello shell
beyes@debian:~/shell$ echo $exp8temp
hello world

可见子 shell 对父 shell 里 export 出来的变量进行修改并不能影响到父 shell。这说明了,子 shell 只是在“导出变量列表“里对该变量进行了一个拷贝。但反过来,父shell再次更改此变量时,子 shell 再去读时,读到的是新值,而不是原来的值。

4. 如果在子 shell 里 export 出的变量,父 shell 是否能读到呢?先将下面一段代码放在后台运行:

#!/bin/bash
export exp9temp="hello world"
sleep 30
exit 0

然后在在 30 秒内在父 shell 里读取一下 $exp9temp 的值,发现输出为空。所以我们得出结论,export 出来的变量不能导出到父进程或者是父进程的环境里。一个自己称可以继承父进程的东西,而不能反过来去影响父进程。

那么子 shell 有什么办法可以向父 shell 传递自己的变量吗?下面方法可以考虑:

  1. 通过一个中间文件进行:

    #!/bin/bash
    (
     subvar="hello shell"
     echo "$subvar" > temp.txt
    )
    
    read pvar < temp.txt
    echo $pvar
    
    运行输出:
    $ sh subandp.sh
    hello shell
    
  2. 通过命令替换:

    #!/bin/bash
    pvar=`subvar="hello shell";echo $subvar`
    echo $pvar
    

运行输出: ::

$ ./subandp.shhello shell

执行命令替换符(两个反单引号)之间的命令也是在子 shell 来完成的。

  1. 使用命名管道:

    #!/bin/bash
    
    mkfifo -m 777 npipe
    (
      subsend="hello world"
      echo "$subsend" > npipe &
     )
    
    read pread < npipe
    echo "$pread"
    exit 0
    

运行输出:

beyes@debian:~/shell$ ./var.sh
hello world

关于有名管道创建命令 mkfifo 可参考:http://www.groad.net/bbs/read.php?tid-3707.html

  1. 使用 here 文档:

    #!/bin/bash
    read pvar << HERE
    `subvar="hello shell"
    echo $subvar`
    HERE
    echo $pvar
    

运行输出:

$ ./subandp.sh
hello shell

方法应该还有很多,这些方法的本质原理基于进程间的通信。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值