2013-03-11 29 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個命令由||運算符分隔。