我正在编写一个小脚本,在执行任何操作之前,请检查是否已安装某些必需的软件,然后轰炸或重新配置自身以不需要丢失的应用程序。目前,它是通过查看对“哪个”的调用是否成功来实现的。
很显然,由于这是关键的基础结构,因此很高兴测试此功能是否可靠运行(以提供一些想法,我正在检查的应用程序有多重要,即“ cowsay”和“ fortune”)。没有人能想到一种方法,除了卸载或重命名之外,我可以暂时愚弄“哪个”(或其他命令,如果有一个可以用来实现我想要的功能),以为没有安装?
我认为这可能对我的其他项目很有用,我的雇主认为这些项目对企业而言几乎与此项目一样有价值。
谢谢!
答案 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
函数返回cat
和grep
(例如)的非零状态(1),使其看起来好像没有安装。which
函数使用内置的command
为其他输入运行真实的which
。由于这是函数中要做的最后一件事,因此,实数which
的退出状态将用作which
函数的返回状态。export -f which
导出函数,以便在从当前外壳程序(或其子程序等)运行的Bash程序中对其进行定义。在这种情况下,这意味着该函数将在“ myprog”中定义。bash myprog ...
)显式运行程序,而不是直接运行(./myprog ...
)意味着即使myprog
使用-p
,导出的函数也可以使用shebang行上的选项。-p
降低了Bash程序由于环境变量或个人配置文件中的异常情况而发生故障的风险。例如,它使Bash程序不受与{em> all 版本的Bash导出功能有关的Shellshock错误的影响。)type
命令而不是外部的which
命令。参见How to check if a program exists from a Bash script?。