V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
uti6770werty
V2EX  ›  Linux

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

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

    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   ·   实用小工具   ·   5748 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:47 · PVG 10:47 · LAX 18:47 · JFK 21:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.