在 Shell 脚本里,如何在脚本的运行过程中,马上应用新的$PATH 环境变量? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
uti6770werty
V2EX    Linux

在 Shell 脚本里,如何在脚本的运行过程中,马上应用新的$PATH 环境变量?

  •  
  •   uti6770werty 2022-03-31 10:27:19 +08:00 3414 次点击
    这是一个创建于 1371 天前的主题,其中的信息可能已经有所发展或是发生改变。

    CentOS7
    如:

    testsh:sh 内容 sed -i '$a\export PATH="$PATH:/usr/local/mysql/bin:/root"' /etc/profile export PATH="$PATH:/usr/local/mysql/bin:/root" # 上面是添加了新环境变量 # 以下此命令,需要具有环境变量 /usr/local/mysql/bin 在 PATH 里 # 但是在 shell 里,似乎上面的 export PATH 是没有应用上的, # 请问应该如何马上起效呢? /usr/local/mysql/bin/mysql_secure_installation 
    10 条回复    2022-03-31 19:20:32 +08:00
    duke807
        1
    duke807  
       2022-03-31 10:34:17 +08:00 via Android
    你的似乎不
    本就是立即生效
    uti6770werty
        2
    uti6770werty  
    OP
       2022-03-31 10:37:36 +08:00
    @duke807 在两个步骤之间,我增加过一个 export 输出当前环境变量打印出来,
    export PATH="$PATH:/usr/local/mysql/bin:/root"
    这条在 shell 的运行过程中,确实没有应用上。。。
    stephenyin
        3
    stephenyin  
       2022-03-31 10:37:54 +08:00   1
    export PATH="/usr/local/mysql/bin:/root:$PATH"
    uti6770werty
        4
    uti6770werty  
    OP
       2022-03-31 11:02:19 +08:00
    @stephenyin 成功了,搞不懂为啥把变量放后面就可以。。。
    stephenyin
        5
    stephenyin  
       2022-03-31 11:08:57 +08:00
    @uti6770werty #4 影响查找依赖的顺序,你原来的 $PATH 里应该有一个同名依赖文件。
    libook
        6
    libook  
       2022-03-31 11:38:14 +08:00
    export 指令会在当前 Shell 会话中立即生效。

    Shell 会使用 PATH 环境变量的值从左到右每个目录查找是否有相应的指令文件存在,你原$PATH 拼在左边就会被先搜索,拼在右边就会被后搜索,搜索到第一个匹配的项就停止搜索。

    你可以做个试验:
    cd /tmp
    mkdir a
    mkdir b
    echo "echo a">a/e
    echo "echo b">b/e
    chmod +x a/e
    chmod +x b/e
    export PATH=/tmp/a:$PATH:/tmp/b

    然后你执行 e ,看输出的是 a 还是 b 。

    你拼左侧不起作用可能是左侧的目录中已经存在 mysql_secure_installation 这个名称的文件了。

    想要检查某个指令当前在 PATH 环境变量中的位置,可以用 which 指令,如`which mysql_secure_installation`。
    diggzhang
        7
    diggzhang  
       2022-03-31 11:44:32 +08:00
    试试这个办法,在脚本正式逻辑执行前将环境变量文件重新 export:

    ```shell
    #argumaents 1=abs_file_path
    function export_from_file() {
    while read LINE; do export "$LINE"; done < $1
    }

    export_from_file /path/to/envfile
    ```
    MiketsuSmasher
        8
    MiketsuSmasher  
       2022-03-31 12:59:12 +08:00
    小常识:export PATH 的时候应该把自定义路径放在原有 PATH 的前面
    `export PATH=<custom path>:$PATH`
    veightz
        9
    veightz  
       2022-03-31 13:04:32 +08:00
    可以贴一下具体的报错, 如果是命令找不到的话, 也可以 which 一下看一下
    tedding
        10
    tedding  
       2022-03-31 19:20:32 +08:00
    ProjectPath=$HOME/Documents/Workspace/Path/To/Project
    NODE=$HOME/.nvm/versions/node/v16.14.2

    export PATH=$NODE/bin:$PATH
    cd $ProjectPath
    npm run start:prep


    不同项目的 node 版本不同 我是用 shell 脚本 执行的。。。因为我也记不住哪个项目对应哪个版本
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3241 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 10:15 PVG 18:15 LAX 02:15 JFK 05:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86