Bash

Bash:回顯還是<<<更好?

  • October 30, 2018

傳遞輸入時,哪種方法更好?

&gt; echo 'test' | base64
dGVzdAo=

&gt; base64 &lt;&lt;&lt; 'test'
dGVzdAo=

對於變數,應該使用哪種方法?

&gt; t='test'

&gt; echo "$t" | base64
dGVzdAo=

&gt; base64 &lt;&lt;&lt; "$t"
dGVzdAo=

&lt;&lt;&lt;是 here-string,here-document 的縮寫形式,由90 年代初zsh(和 Unix 埠)引入,並從那時起複製(有變體)到許多其他 shell。rc

它的實現方式與 here-documents 相同。zsh在包括and在內的大多數 shellbash中,它帶有一個已刪除的臨時文件,因為 Bourne shell(在 70 年代後期引入 here-documents 的 shell)就是這樣做的。

當你這樣做時:

cmd &lt;&lt;&lt; 'something'

外殼執行以下操作:

file=$(mktemp)
printf 'something\n' &gt; "$file"
{
 rm -f -- "$file" && cmd
} &lt; "$file"

(當然除了所有的mktemp, printf,rm都是在內部完成而不執行這些命令)。

一些 shell 使用管道和一個單獨的程序(可以是分叉命令或小的 here-docs/strings 的主 shell 程序)來提供數據。一些 shell 可能會恢復為使用/dev/null空的 here-docs(here-strings 不能為空,除非rc它不添加換行符)。

在使用臨時文件的實現中有幾個優點。

  • 沒有分叉的程序。
  • 輸入是可搜尋的(該命令可以在其輸入中來回移動以再次讀取不同位置的數據,當它的輸入是管道時它不能這樣做)。但是,您不能在可移植sh腳本中依賴它。

一些缺點:

  • 除了 in zsh,內容不能包含 NUL 字節
  • 除了 in rc,不可能提供不以換行符結尾的輸入
  • 臨時文件創建可能會失敗(例如當沒有剩餘空間$TMPDIRumask某些實現過於限制時)。
  • 數據儲存在永久儲存器中。即使文件在它之前被刪除read,數據最終可能會被送出到磁碟,這意味著如果可以抓住磁碟,它可以被恢復。

在:

printf '%s\n' "$something" | cmd

(這裡 usingprintf而不是echoasecho不能用於任意數據)。

我們有兩個程序同時執行,一個通過管道將輸出提供給另一個。When cmdis builtin 或複合命令或函式,with zshor AT&T kshor bash -o lastpipe,該命令在目前shell中執行,但在子程序中執行,所以類似的東西echo x | read var不起作用。

這樣做的一些好處:

  • 那是可移植的(相反&lt;&lt;&lt;&lt;&lt;是可移植的)
  • 沒有&lt;&lt;&lt;上面提到的缺點
  • 要在 shell 中提供 NUL 字節zshzsh是唯一可以將 NUL 字節傳遞給內置命令的 shell),您可以這樣做printf '\0' | cmd

缺點:

  • cmd如上所述,額外程序和在某些 shell 中的子程序中執行的事實
  • 輸入不可搜尋。

請注意,如果您想要 base64 編碼test,那就是:

printf test | base64

或者

printf %s "$data" | base64

對於任意數據。

你的給你base64編碼test&lt;newline&gt;

引用自:https://unix.stackexchange.com/questions/478614