首页 > 代码库 > linux shell 的变量问题 &&export 语句作用 &&su 与 su - 的区别

linux shell 的变量问题 &&export 语句作用 &&su 与 su - 的区别

                                                      首先来看看变量的问题


[root@localhost ~]# dhh=1

[root@localhost ~]# echo $dhh
1

开一个子shell测试

[root@localhost ~]# bash

[root@localhost ~]# echo $dhh

没有值

                 使用export方法

 [root@localhost ~]# exit      ----------退出子shell 
exit
root@localhost ~]# export dhh
[root@localhost ~]# bash    -----------新建子shell
[root@localhost ~]# echo $dhh
1

这样我们就能说:export   能够将本shell定义的变量传递给给子shell用

但是 子shell的变量能够通过exprot讲变量值传递给父shell吗??

[root@localhost ~]# bash
[root@localhost ~]# dkk=1
[root@localhost ~]# export dkk
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $dkk

没有值

答案是:不行的。。。

要实现的话。。有下面几个方法            来自  http://blog.csdn.net/dreamcoding/article/details/8519689

那么子 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

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


                                                                             再来看看  su 与 su - 切换用户的区别


su 方法

[root@localhost ~]# useradd test

[root@localhost ~]# test1=1

[root@localhost ~]# su test
[test@localhost root]$ echo $test1

没有值

        然而使用export传递变量是可行的

[root@localhost ~]# export test=1

[root@localhost ~]# su test

[test@localhost root]$ echo $test
1

[test@localhost root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
-----环境变量与root的环境变量相同

再来看看  su -   方法

[root@localhost ~]# su - test
[test@localhost ~]$ echo $test

没有值
[test@localhost ~]$ echo $test1
没有值

[test@localhost ~]$ echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/test/bin------------环境变量与root环境变量不同

 综合所诉: