如图:两个shell终端的编码分别是GBK和UTF-8,分别设置export LC_ALL=zh_CN.GBK和export LC_ALL=zh_CN.UTF-8,结果发现两个终端的系统编码互不干扰,这是说一个Linux系统在不同的终端,有不同的系统编码?
想知道系统编码到底是指什么?请大家指教
如图:两个shell终端的编码分别是GBK和UTF-8,分别设置export LC_ALL=zh_CN.GBK和export LC_ALL=zh_CN.UTF-8,结果发现两个终端的系统编码互不干扰,这是说一个Linux系统在不同的终端,有不同的系统编码?
想知道系统编码到底是指什么?请大家指教
这个涉及到进程和系统环境变量的关系问题。两个终端是两个不同的进程,LC_ALL是系统环境变量。
只有上升到这个层次,才能想明白这个问题。
例如,在一个进程中修改了环境变量PATH:
它会影响到它的父进程吗?不会,它会影响到它的子进程吗?一会测试一下。
两个不同的终端他们可能是什么关系?他们大概率是兄弟进程关系关系。肯定不会。
在一个已经打开的终端中使用export修改一个环境变量,会影响另一个已经打开的终端环境变量吗?不会,这个可以测试。
测试一 子进程更改环境变量,不影响父进程
1 先查看当前的PATH值
csdn@ubuntu:~/shelltest$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
csdn@ubuntu:~/shelltest$
2 添加一个脚本,名为child.sh,并执行这个脚本
echo "i'm a child"
echo 'child PATH'=$PATH
export PATH=/home/lkmao
echo 'modify child PATH'=$PATH
执行child.sh,如下所示,看到,确实更改了PATH的值。
csdn@ubuntu:~/shelltest$ bash child.sh
i'm a child
child PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
modify child PATH=/home/lkmao
csdn@ubuntu:~/shelltest$
3 在终端中再次查看PATH的值。为了证明清白,这里截图了,看到PATH值没变
测试二:父进程修改环境变量值,会影响子进程吗?
这个简单一点,首先在终端执行export PATH=/hello/world/:$PATH
然后执行bash child.sh,观察输出结果:见下图,发现父进程修改了PATH的值,影响了子进程的环境变量值。
测试三:不同终端的环境变量会影响吗?接着上面的测试,分别打印两个终端的进程号 echo $$,然后再打印两个终端的环境变量PATH,发现不会有影响。除非这个值被以export VAL="新的值"的形式添加到了,/etc/profile后面,而且,这也得,新打开的终端才会生效。后者是在终端中执行source /etc/profile。