• 利用shell脚本添加环境变量


    在shell脚本设置了环境变量,如export LIBRARY_PATH=./lib/,执行了此脚本后, 在执行生成的可执行文件,提示错误

    error while loading shared libraries: libww.so: cannot open shared object file: No such file or directory

    但是如果把export那句话单独在命令行运行,在gcc编译代码后不会出现问题

    怎么也想不通,为什么脚本执行了,设置了环境变量,但是运行可执行文件总是失败。

    查看大牛博客,终于发现

    原因是执行脚本用./test.sh的方式,如果采用source test.sh,则环境变量会生效。

    ./XXX.sh的时候,脚本里面打印PATH是改了,但是在终端echo $PATH却没有看到变化,因为这样执行等于说不在当前进程

    那么。这是为什么呢?

    关键:直接执行一个脚本文件是在一个子shell中运行的,而source则是在当前shell环境中运行的。

    1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;
    2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量)
    3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。
    4、不用export定义的变量只对该shell有效,对子shell也是无效的。
     
    另:
    ---- 在UNIX系统中,我们在运行shell程序或系统命令的过程如下:  

    ---- 假设在当前的shell环境下,我们运行ps -f命令.  

    ---- 首先,当前的shell会调用:fork()命令,产生一个subprocess,该子进程完全复制了父进程的所有环境;  

    ---- 之后,当前的shell会调用:exec ps -f命令,在新的子进程的环境中,运行ps -f 命令.子进程的环境变量会根据新的应用进行调整,并使之运行,当应用完成之后,子进程结束,返回到父进程.  

    ---- 因此,通过上述过程分析,$cbpsprofile的运行的结果就可以预见,该shell程序的运行,环境变量重新赋值仅仅在子进程中,程序运行完后,返回到父进程,父进程的环境变量是不会受到影响的
     
    参考:
    https://blog.csdn.net/xhz_1983/article/details/73250033
    https://blog.csdn.net/wgembed/article/details/22385469
    https://www.cnblogs.com/fdd566/p/6692595.html
    https://blog.csdn.net/moqingxinai2008/article/details/53909464
     
  • 相关阅读:
    算法---递归及尾递归
    ScheduledThreadPoolExecutor之remove方法
    数据结构---队列及简单实现有界队列
    数据结构---栈及四则运算实现
    数据结构---链表及约瑟夫环问题带来的思考
    数据结构---数组
    时间复杂度和空间复杂度
    Redis缓存设计与性能优化
    Springboot+ELK实现日志系统简单搭建
    Docker学习笔记(三):Dockerfile及多步骤构建镜像
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/9953144.html
Copyright © 2020-2023  润新知