bash在以下示例中何時或如何刪除尾隨換行符?爲什麼bash刪除尾隨換行符
echo -n "$(echo foo)" | wc -C# why is this 3 not 4
a="$(echo foo | tail -c 1)" # why is $a empty and not "\n"
bash在以下示例中何時或如何刪除尾隨換行符?爲什麼bash刪除尾隨換行符
echo -n "$(echo foo)" | wc -C# why is this 3 not 4
a="$(echo foo | tail -c 1)" # why is $a empty and not "\n"
從https://manpages.debian.org/stretch/bash/bash.1.en.html#Command_Substitution
擊執行由在子shell環境中執行命令和與所述命令的標準輸出替換命令替換,刪除與任何尾隨的換行符的擴展。
這種行爲也是由POSIX規定:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
例如,echo'foo'給出foo並在最後添加新的行字符。這就是爲什麼shell提示符(可能是$)出現在新行中的原因。
$echo 'foo'
foo
$
如果是用WC -c管道,它會給4作爲結果,因爲後新行字符也算作
$echo 'foo' | wc -c
4
$
如果-n選項與回波使用默認尾隨新行字符被抑制並且shell提示符出現在同一行中。 例如,
$echo -n 'foo'
foo$
現在,如果字符數是通過WC -c計數,它給3,因爲沒有拖尾新行字符是否存在。
$echo -n 'foo' | wc -c
3
出於同樣的原因, echo -n "$(echo foo)" | wc -c
當屬3而不是4,因爲-n抑制會如果沒有使用-n已經出現了新的行字符。 如果-n將被移除,您將得到4個答案。
a="$(echo foo | tail -c 1)"
正如我所看到的,echo $a
給出了一個空的空行,然後將該殼提示符$,這意味着一個$後具有\ n的表示新的空行。這是預期的和完美的。
如果沒有\ n是$ a,shell提示$會出現在連續行中,並且不會出現空行。