首页 > 代码库 > 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 传递自己的变量吗?下面方法可以考虑:
通过一个中间文件进行:
#!/bin/bash ( subvar="hello shell" echo "$subvar" > temp.txt ) read pvar < temp.txt echo $pvar 运行输出: $ sh subandp.sh hello shell
通过命令替换:
#!/bin/bash pvar=`subvar="hello shell";echo $subvar` echo $pvar
- 运行输出: ::
- $ ./subandp.shhello shell
执行命令替换符(两个反单引号)之间的命令也是在子 shell 来完成的。
使用命名管道:
#!/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
使用 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环境变量不同
综合所诉: