【问题标题】:Please help me de-cipher this line of bash scripting code请帮我破译这行 bash 脚本代码
【发布时间】:2013-03-11 21:10:06
【问题描述】:

这是什么意思?

  h2t=$((exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) \
            || which html2text || which cat) |tail -n 1)

好的,h2t=... 表示它正在设置一个变量。

我认为双括号是用于算术运算的。如果是这样的话,我在那里看不到任何算术,我完全感到困惑。

当然,该行代码上方有一个 15 行的注释块,它解释了意图。不幸的是,评论是古代苏美尔语的 unicode 版本,我无法解释。

**开个玩笑!没有评论。

附录:来自https://github.com/micha/resty/blob/master/resty

【问题讨论】:

标签: bash resty


【解决方案1】:

twalberg 在对我的回答的评论中发现了它。结果是外部$() 分配了一个命令行,这取决于可能能够将HTML 转换为文本的各种工具的可用性。

因此,h2t 包含lynx -stdin -dump 命令行,或者失败(即lynx 不可用),html2text 或作为最后的手段cat。后两者的命令来自which 调用,前者的命令来自echo


它将 HTML 从标准输入转换为文本。

让我们分开吧。

  • exec 2>&- 在子shell 中设置重定向(闭嘴stderr,IIRC)
  • 下一个子子 shell 尝试查看是否安装了 lynx 并运行它,从 stdin 获取输入。
  • || 之后的其他部分没有多大意义,因为它们只评估是否安装了 html2textcat,但不运行它们
  • 然后我们从第一个子 shell 中获取最后一行

从头开始。 因为它是echo,所以它什么也不做。在我看来,这就像原型设计。

将其拆开以提高可读性:

$(
    exec 2>&-
      (
        which lynx >/dev/null &&
        echo lynx -stdin -dump
      ) ||
    which html2text ||
    which cat
  ) |
  tail -n 1
)

【讨论】:

  • 实际上,它只是为变量分配了一个或多或少合适的命令行,其目的是将html转换为文本...如果lynxhtml2text可用,则变量将包含具有该工具的适当命令行,否则,它将回退到默认值 cat
  • @twalberg:很好,你是对的。将其编辑为我的答案。其余部分完好无损。如果你决定自己写,请告诉我,所以我会删除我的。
  • 好的,所以它选择了一个 html2text 程序来运行,因此 var h2t 的名称。它没有运行它。它只是找到它,而 lynx 或 html2text 失败,则选择 cat。如果你真的把这个放在你的答案中,我会接受它!
  • 谢谢,@0xC0000022L,我已经接受了。 “应用程序未能正确初始化”?
  • @Cheeso:你是说0xC0000022L? -> STATUS_ACCESS_DENIED ...大多数人将其缩短为SAD,这让我非常恼火;)
【解决方案2】:

我不记得消除语法歧义的确切规则,但应该这样解析:

h2t=$(
       (exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) ||
         which html2text ||
         which cat) |
       tail -n 1
     )

换句话说,一个命令替换,由一个通过管道传输到tail 的子shell 组成。子shell 用于为exec 命令提供“范围”,然后另一个子shell 启动一个列表,其中3 个命令由|| 运算符分隔。

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 2014-12-26
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多