我喜欢使用命令行工具 howdoi
.默认情况下,它会搜索 stackoverflow.com,但我还想配置 howdoi
来搜索其他 StackExchange 网站。根据this comment ,很容易编写一个 bash
函数来配置 howdoi
来搜索任意 StackExchange 站点:
function howdoi-serverfault { HOWDOI_URL=serverfault.com howdoi $@; }
但这似乎很难维护,因为您必须为要访问的每个 StackExchange 站点编写一个函数。
我考虑过将这种模式概括为“函数工厂”,这样如果我想搜索新站点,它就很容易维护......
function howdoi-factory
{
eval "
function $1 {
echo "Searching $2 for $@";
HOWDOI_URL=$2 howdoi $@;
}
"
}
howdoi-factory howdoi-engineer softwareengineering.stackexchange.com
我希望代码做什么:
> howdoi-engineer write good code
Searching softwareengineering.stackexchange.com for write good code
(answers relating to the keywords "write good code")
我实际上得到的:
> howdoi-engineer write good code
Searching softwareengineering.stackexchange.com for howdoi-engineer softwareengineering.stackexchange.com
(answers relating to the keywords "howdoi-engineer softwareengineering.stackexchange.com")
我需要做什么来确保我的函数工厂能够生成能够接受自己的命令行参数的函数,而不是重复使用“原始”命令行参数?
最佳答案
使用 printf %q
格式字符串安全地格式化数据以包含在函数中。
gen-howdoi() {
local text
for arg; do
printf -v text 'howdoi-%q() { HOWDOI_URL=%q howdoi "$@"; }' "${arg%.*}" "$arg"
eval "$text"
done
}
# this creates howdoi-serverfault and howdoi-stackoverflow
gen-howdoi serverfault.com stackoverflow.com
关于bash - 你如何在 bash 中创建一个 "function factory",其中生成的函数接受它自己的命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48478586/