这是什么意思?
h2t=$((exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) \
|| which html2text || which cat) |tail -n 1)
好的,h2t=...
表示它正在设置一个变量。
我认为双重算法用于算术运算。如果是这样的话我在那里看不到任何算术,而且我完全感到困惑。
当然,在该行代码上面有一个15行注释块,它解释了意图。不幸的是,评论是在古代苏美尔人的unicode版本中,我无法解释它。
**开玩笑!没有评论。
答案 0 :(得分:2)
twalberg在对我的回答的评论中发现了它。事实证明外部$()
分配命令行,具体取决于可能将HTML转换为文本的各种工具的可用性。
因此,h2t
包含lynx -stdin -dump
命令行,或者失败(lynx
不可用),html2text
或最后的cat
。后两者的命令来自which
调用,前者来自echo
。
它将HTML转换为stdin的文本。
让我们分开吧。
exec 2>&-
在子shell中设置重定向(关闭stderr
,IIRC)stdin
获取输入。||
之后的其他部分没有多大意义,因为它们只评估是否安装了html2text
和cat
,但是没有运行它们 抓一点。因为它是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个命令由||
运算符分隔。