请帮我解密这行bash脚本代码
这是什么意思请帮我解密这行bash脚本代码,bash,resty,Bash,Resty,这是什么意思 h2t=$((exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) \ || which html2text || which cat) |tail -n 1) 好的,h2t=…表示它正在设置一个变量 我以为双参数是用于算术运算的。如果是这样的话,我在那里看不到任何算法,我完全困惑不解 当然,在这行代码上面有一个15行的注释块,解释了它的意图。不幸的
h2t=$((exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) \
|| which html2text || which cat) |tail -n 1)
好的,h2t=…
表示它正在设置一个变量
我以为双参数是用于算术运算的。如果是这样的话,我在那里看不到任何算法,我完全困惑不解
当然,在这行代码上面有一个15行的注释块,解释了它的意图。不幸的是,这个评论是古苏美尔语的unicode版本,我无法解释它
**只是开玩笑!没有评论
附录:这是我在对我的回答的评论中发现的。事实证明,外部的$()
会分配一个命令行,这取决于能够将HTML转换为文本的各种工具的可用性
因此h2t
包含lynx-stdin-dump
命令行,或者失败(即lynx
不可用),html2text
或者作为最后手段cat
。后两个的命令来自调用,前者来自echo
它将HTML从标准文本转换为文本
让我们把它分开
exec 2>&-
在子shell中设置重定向(关闭stderr
,IIRC)
- 下一个子shell尝试查看lynx是否已安装并运行它,从
stdin
获取输入
|
后面的其他部分没有多大意义,因为它们只评估是否安装了html2text
和cat
,而不运行它们
- 然后我们从第一个子壳中取出最后一行
擦掉它。因为它是一个回音
它什么都不做。在我看来像是原型
将其拆分以使其更具可读性:
$(
exec 2>&-
(
which lynx >/dev/null &&
echo lynx -stdin -dump
) ||
which html2text ||
which cat
) |
tail -n 1
)
在对我的回答的评论中,我发现了它。事实证明,外部的$()
会分配一个命令行,这取决于能够将HTML转换为文本的各种工具的可用性
因此h2t
包含lynx-stdin-dump
命令行,或者失败(即lynx
不可用),html2text
或者作为最后手段cat
。后两个的命令来自调用,前者来自echo
它将HTML从标准文本转换为文本
让我们把它分开
exec 2>&-
在子shell中设置重定向(关闭stderr
,IIRC)
- 下一个子shell尝试查看lynx是否已安装并运行它,从
stdin
获取输入
|
后面的其他部分没有多大意义,因为它们只评估是否安装了html2text
和cat
,而不运行它们
- 然后我们从第一个子壳中取出最后一行
擦掉它。因为它是一个回音
它什么都不做。在我看来像是原型
将其拆分以使其更具可读性:
$(
exec 2>&-
(
which lynx >/dev/null &&
echo lynx -stdin -dump
) ||
which html2text ||
which cat
) |
tail -n 1
)
我不记得消除语法歧义的确切规则,但应该这样分析:
h2t=$(
(exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) ||
which html2text ||
which cat) |
tail -n 1
)
换句话说,一种命令替换,由一个子shell组成,该子shell通过管道传输到tail
。子shell用于为exec
命令提供一个“作用域”,然后另一个子shell启动一个列表,该列表的3个命令由|
运算符分隔。我不记得消除语法歧义的确切规则,但应该这样解析:
h2t=$(
(exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) ||
which html2text ||
which cat) |
tail -n 1
)
换句话说,一种命令替换,由一个子shell组成,该子shell通过管道传输到tail
。子shell用于为exec
命令提供一个“作用域”,然后另一个子shell启动一个列表,该列表的3个命令由|
操作符分隔。它是否真的说$(
?是-请查看源代码。它是否真的说$((
?是-请参阅以获取源代码。实际上,它只为变量分配了或多或少合适的命令行,其目的是将html转换为文本…如果lynx
或html2text
可用,则变量将包含具有该工具的适当命令行,否则,它将返回默认值猫的
@twalberg:很好,你是对的。把它编辑到我的答案中。剩下的保持原样。如果你决定写你自己的,让我知道,所以我会删除我的。好的,它选择了一个html2text程序来运行,因此命名为varh2t
。它没有运行它。它只是找到它,并且失败了lynx或html2text,选择ses cat。如果你真的把这个写进你的答案中,我会接受的!谢谢,@0xC000002L,我已经接受了。“应用程序未能正确初始化”@Cheeso:你的意思是0xC000002L
?->状态访问被拒绝
…大多数人把这个缩短为SAD
,这让我非常恼火;)实际上,它只为一个变量分配了一个或多或少合适的命令行,其目的是将html转换为文本…如果lynx
或html2text
可用,该变量将包含一个具有该工具功能的适当命令行,否则,它将返回默认值cat
@twalberg:good catch,你是对的。将它编辑到我的答案中。保留其余部分不变。如果你决定编写你自己的,请告诉我,我将删除我的。好的,它选择一个html2text程序来运行,因此命名为varh2t
。它没有运行它。它只是找到它,如果lynx或html2text失败,则选择cat。如果你真的把它放在你的答案中回答我会接受的!谢谢,@0xC0000022L,我已经接受了。“应用程序未能正确初始化”@Cheeso:你的意思是0xC000002L
?->STATUS\u ACCESS\u DENIED
…大多数人把它缩短为SAD
,这让我非常恼火;)