Bash
Bash:回顯還是<<<更好?
傳遞輸入時,哪種方法更好?
> echo 'test' | base64 dGVzdAo= > base64 <<< 'test' dGVzdAo=
對於變數,應該使用哪種方法?
> t='test' > echo "$t" | base64 dGVzdAo= > base64 <<< "$t" dGVzdAo=
<<<
是 here-string,here-document 的縮寫形式,由90 年代初zsh
(和 Unix 埠)引入,並從那時起複製(有變體)到許多其他 shell。rc
它的實現方式與 here-documents 相同。
zsh
在包括and在內的大多數 shellbash
中,它帶有一個已刪除的臨時文件,因為 Bourne shell(在 70 年代後期引入 here-documents 的 shell)就是這樣做的。當你這樣做時:
cmd <<< 'something'
外殼執行以下操作:
file=$(mktemp) printf 'something\n' > "$file" { rm -f -- "$file" && cmd } < "$file"
(當然除了所有的
mktemp
,printf
,rm
都是在內部完成而不執行這些命令)。一些 shell 使用管道和一個單獨的程序(可以是分叉命令或小的 here-docs/strings 的主 shell 程序)來提供數據。一些 shell 可能會恢復為使用
/dev/null
空的 here-docs(here-strings 不能為空,除非rc
它不添加換行符)。在使用臨時文件的實現中有幾個優點。
- 沒有分叉的程序。
- 輸入是可搜尋的(該命令可以在其輸入中來回移動以再次讀取不同位置的數據,當它的輸入是管道時它不能這樣做)。但是,您不能在可移植
sh
腳本中依賴它。一些缺點:
- 除了 in
zsh
,內容不能包含 NUL 字節- 除了 in
rc
,不可能提供不以換行符結尾的輸入- 臨時文件創建可能會失敗(例如當沒有剩餘空間
$TMPDIR
或umask
某些實現過於限制時)。- 數據儲存在永久儲存器中。即使文件在它之前被刪除
read
,數據最終可能會被送出到磁碟,這意味著如果可以抓住磁碟,它可以被恢復。在:
printf '%s\n' "$something" | cmd
(這裡 using
printf
而不是echo
asecho
不能用於任意數據)。我們有兩個程序同時執行,一個通過管道將輸出提供給另一個。When
cmd
is builtin 或複合命令或函式,withzsh
or AT&Tksh
orbash -o lastpipe
,該命令在目前shell中執行,但在子程序中執行,所以類似的東西echo x | read var
不起作用。這樣做的一些好處:
- 那是可移植的(相反
<<<
,<<
是可移植的)- 沒有
<<<
上面提到的缺點- 要在 shell 中提供 NUL 字節
zsh
(zsh
是唯一可以將 NUL 字節傳遞給內置命令的 shell),您可以這樣做printf '\0' | cmd
。缺點:
cmd
如上所述,額外程序和在某些 shell 中的子程序中執行的事實- 輸入不可搜尋。
請注意,如果您想要 base64 編碼
test
,那就是:printf test | base64
或者
printf %s "$data" | base64
對於任意數據。
你的給你base64編碼
test<newline>
。