我已經成功地寫入以下功能:發現的print0選項重新實現在bash和awk(perl的)
function print0(){
stdin=$(cat);
echo "$stdin" | awk 'BEGIN {ORS="\000";}; { print $0}';
}
它可以作爲一個-print0
論點find
命令,但基本上都是針對通過它的輸出到該功能的任何命令。這對xargs -0
很有用。然後我意識到,與此功能相反也是有用的。我曾嘗試以下操作:
function read0(){
stdin=$(cat);
echo "$stdin" | awk 'BEGIN {RS="\000"; ORS="\n";}; {print $0}';
# EQUIVALENTS:
# echo "$stdin" | perl -nle '@a=join("\n", split(/\000/, $_)); print "@a"'
# echo "$stdin" | perl -nle '$\="\n"; @a=split(/\000/, $_); foreach (@a){print $_;}'
}
但它沒有工作,有趣的是,當我嘗試了命令(AWK或Perl),它的工作就像一個魅力:
# WORKING
ls | print0 | awk 'BEGIN {RS="\000"; ORS="\n";}; {print $0}'
ls | print0 | perl -nle '@a=join("\n", split(/\000/, $_)); print "@a"'
ls | print0 | perl -nle '$\="\n"; @a=split(/\000/, $_); foreach (@a){print $_;}'
# DOES NOT WORKING
ls | print0 | read0
我在做什麼錯?我假設的東西是錯誤通過以下命令處理空字符:stdin=$(cat);
編輯: 謝謝大家,得出的結論是bash的變量不能持有空值。 PS:提到的命令就像我知道的將NULL轉換成換行符一樣,反之亦然沒有理性的原因。
+1有趣。雖然幫不了你。 – 2013-12-10 19:43:20
shell在內部使用C字符串,C使用'\ 0'作爲字符串終止符。所以你不能把它當作字符串中的一個字符,它只會結束它。 – Barmar