我正在尝试编写一个.bashrc
文件,以便使用#!/usr/bin/env
shebang 的文件将根据它们所在的目录调整其 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 外部生成的进程都将不可见。