请帮我解一下这行bash脚本代码

时间:2013-03-11 21:10:07

标签: bash resty

这是什么意思?

  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

2 个答案:

答案 0 :(得分:2)

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

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


它将HTML转换为stdin的文本。

让我们分开吧。

  • 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
)

答案 1 :(得分: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个命令由||运算符分隔。