bash - 你如何在 bash 中创建一个 "function factory",其中生成的函数接受它自己的命令行参数?

标签 bash

我喜欢使用命令行工具 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/

相关文章:

linux - Bash switch 语句和执行多个程序

regex - 使用 grep 更改过滤字符串中的结果

bash - 将 bash for 循环与 bash 脚本的嵌入式 applescript 结合使用

mysql - Bash 脚本中的意外文件结尾?

bash - 在 Linux 上使用 postgres bash 运行选择查询时打印的行数有限

linux - 监控 bash 脚本不会终止

linux - 如何将变量传递给 bash 脚本中的命令参数?

bash - CircleCI - 根据分支对环境变量的不同值

bash - set -- “$@” "$i"在 Bash 中是什么意思?

bash - 是否可以在 bash 脚本中检测 32 位和 64 位?