使用 .bashrc 根据 PWD 修改 /usr/bin/env 的执行

使用 .bashrc 根据 PWD 修改 /usr/bin/env 的执行

我正在尝试编写一个.bashrc文件,以便使用#!/usr/bin/envshebang 的文件将根据它们所在的目录调整其 PATH。

我的以下内容已经实现了我想要的目标~/.bashrc

function env() {
    case $PWD/ in
        /var/www/php73/*)
            PATH=~/bin73;;
        /var/www/php8.1/*)
            PATH=~/bin81;;
    esac
    /usr/bin/env "$@"
}

然后,如果我env/var/www/php73或任何子目录调用,我就会~/bin73根据需要包含在路径中。

问题是这对于使用 shebang 的文件不起作用,#!/usr/bin/env因为 .bashrc 仅定义了函数env,而不是env具有完整路径的程序。

使用shebang的时候可以.bashrc修改吗?PATH如果是这样,怎么办?

答案1

/usr/bin/env您可以为此编写一个包装器:

mv /usr/bin/env /usr/bin/env.bak
cat <<-EOF >/usr/bin/env
    #!/usr/bin/bash
    export PATH="${PWD}:${PATH}"
    /usr/bin/env.bak "$@"
EOF
chmod 755 /usr/bin/env

每一个不过,流程会使用这个新的env

如果您只想让您的 shell 及其子级看到这个新的env,这个问题概述了一些解决方案:使进程读取同一文件名的不同文件

但它们都不是完美的。如果您使用了可接受的解决方案(安装命名空间),那么您从 shell 进行的任何安装对于 shell 外部生成的进程都将不可见。

相关内容