暂时隐藏可执行文件以进行测试

时间:2019-04-25 11:45:47

标签: bash

我正在编写一个小脚本,在执行任何操作之前,请检查是否已安装某些必需的软件,然后轰炸或重新配置自身以不需要丢失的应用程序。目前,它是通过查看对“哪个”的调用是否成功来实现的。

很显然,由于这是关键的基础结构,因此很高兴测试此功能是否可靠运行(以提供一些想法,我正在检查的应用程序有多重要,即“ cowsay”和“ fortune”)。没有人能想到一种方法,除了卸载或重命名之外,我可以暂时愚弄“哪个”(或其他命令,如果有一个可以用来实现我想要的功能),以为没有安装?

我认为这可能对我的其他项目很有用,我的雇主认为这些项目对企业而言几乎与此项目一样有价值。

谢谢!

1 个答案:

答案 0 :(得分:0)

一种执行所需操作的方法是定义一个which函数,该函数假装未安装某些工具。如果Bash找到具有名称的函数,则不会在PATH上查找命令。假设您的程序名为“ myprog”,则此Shellcheck干净的代码演示了这个想法:

#! /bin/bash -p

function which
{
    local -r prog=$1

    case $prog in
        cat)    return 1;;
        grep)   return 1;;
        *)      command which -- "$prog";;
    esac
}

export -f which

bash myprog arg1 arg2
  • which函数返回catgrep(例如)的非零状态(1),使其看起来好像没有安装。
  • which函数使用内置的command为其他输入运行真实的which。由于这是函数中要做的最后一件事,因此,实数which的退出状态将用作which函数的返回状态。
  • export -f which导出函数,以便在从当前外壳程序(或其子程序等)运行的Bash程序中对其进行定义。在这种情况下,这意味着该函数将在“ myprog”中定义。
  • 使用Bash(bash myprog ...)显式运行程序,而不是直接运行(./myprog ...)意味着即使myprog使用-p,导出的函数也可以使用shebang行上的选项。
    (在shebang行上使用-p降低了Bash程序由于环境变量或个人配置文件中的异常情况而发生故障的风险。例如,它使Bash程序不受与{em> all 版本的Bash导出功能有关的Shellshock错误的影响。)
  • 请注意,通常最好使用内置的Bash type命令而不是外部的which命令。参见How to check if a program exists from a Bash script?
相关问题