在脚本中使用别名

在脚本中使用别名

我使用的软件工具之一要求“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 的符号链接。

相关内容