![在脚本中使用别名](https://linux22.com/image/859637/%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%88%AB%E5%90%8D.png)
我使用的软件工具之一要求“sh”是指向“bash”而不是“dash”的符号链接。由于我不想将整个系统的默认 shell 更改为 bash,而且我无法更改工具本身,因此我尝试编写一个脚本,将 sh 别名为 /bin/bash。别名本身不起作用,因为对 sh 的调用是通过完整路径:/bin/sh
而不是仅通过 来完成的sh
。
有没有办法可以欺骗可执行文件,使它认为 /bin/sh 实际上是另一个文件,而且无需 root 权限,也不会影响其他程序?
谢谢
答案1
如果有问题的工具很差劲,无法/bin/sh
直接调用,而不是使用 来尊重您的系统设置,那么您的选择将非常有限。我原本以为您基本上可以做虚拟环境对 Python 所做的事,但在尝试编写一个可以这样做的脚本后,我无法通过任何魔法/usr/bin/env sh
绕过直接调用。/bin/sh
$PATH
- 在调用该工具之前,将 sh 重新符号链接到 bash,然后在调用该工具后撤消您的更改。
- 更好的办法是,改变你无法编辑该工具的假设。这个工具是什么?如果它是开源的(假设你了解它的工作原理,那么它似乎是开源的),那么就分叉它,更改它以供使用
/usr/bin/env sh
,然后提交拉取请求。为开源贡献欢呼!
如果有问题的工具实际上没有/bin/sh
直接调用,正如您最近的评论可能表明的那样,则以下内容应该有效。
#!/usr/bin/env sh
BASH_VENV_HOME=$HOME/.bash_venv
if [ ! -d $BASH_VENV_HOME ]; then
mkdir $BASH_VENV_HOME
fi
# Make an `sh` binary in the front of your path that points to bash
if [ ! -e $BASH_VENV_HOME/sh ]; then
ln -s /bin/bash $BASH_VENV_HOME/sh
fi
orig_path=$PATH
PATH=$BASH_VENV_HOME:$PATH
# Call your tool
# Reset path
PATH=orig_path
如果该工具执行sh
,它就会找到路径前面的那个,即指向 bash 的符号链接。