2

这是什么意思?

  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

4

2 回答 2

2

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

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


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

让我们把它分开。

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

刮那个。因为它是一个echo它不做任何事情。对我来说看起来像是原型设计。

将其拆开以提高可读性:

$(
    exec 2>&-
      (
        which lynx >/dev/null &&
        echo lynx -stdin -dump
      ) ||
    which html2text ||
    which cat
  ) |
  tail -n 1
)
于 2013-03-11T21:11:44.270 回答
2

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

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

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

于 2013-03-11T21:17:41.643 回答