2013-03-11 35 views
2

这是什么意思?请帮我解密这行bash脚本代码

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

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

我认为double-parens是算术运算。如果是这种情况,我在那里看不到任何算术,我完全困惑。

当然,该代码行上面有一个15行的注释块,它解释了这个意图。不幸的是,这个评论是在古代苏美尔人的unicode版本中,我不能解释它。

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

附录:这是https://github.com/micha/resty/blob/master/resty

+0

它真的说'$(('' – 0xC0000022L 2013-03-11 21:13:38

+0

是的 - 请参阅https://github.com/micha/resty/blob/master/resty的来源 – Cheeso 2013-03-11 21:15:22

回答

2

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

因此h2t中包含的任何lynx -stdin -dump命令行,或做不到这一点(即lynx不可用),html2text或作为最后的手段cat。后两者的命令来自which调用,前者的调用来自echo


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

让我们来分解它。

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

获取最后一行抓住那个。由于它是echo它什么都不做。看起来像原型对我。

把它拆开,使更具可读性:

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

实际上,它只赋值给一个变量更多 - 或更少适合的命令行,其目的是将html转换为文本...如果有'lynx'或'html2text'可用,则该变量将包含一个以该工具为特征的适当命令行,否则它会回退到'cat'的默认值 – twalberg 2013-03-11 21:18:08

+0

@twalberg:很好,你说的对,把它编辑成我的答案,其余的完整,让我知道你是否决定写自己的,所以我会删掉我的。 – 0xC0000022L 2013-03-11 21:24:33

+0

好的,所以它选择了一个html2text程序来运行,因此它的名字是'h2t',它并没有运行它,它只是找到它,而失败的lynx或者html2text,选择了cat,如果你真的把它放在你的答案中,我会接受的! – Cheeso 2013-03-11 21:57:08

2

我不记得消除歧义的语法规则,准确,但应分析是这样的:

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

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