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"
答案 0 :(得分:3)
来自https://manpages.debian.org/stretch/bash/bash.1.en.html#Command_Substitution
Bash通过在子shell环境中执行命令并使用命令的标准输出替换命令替换来执行扩展,并删除任何尾随换行符。
此行为也由POSIX指定:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
答案 1 :(得分:0)
$echo 'foo'
foo
$
如果使用wc -c进行管道传输,则会产生4,因为也会计算尾随新行字符
$echo 'foo' | wc -c
4
$
如果-n选项与echo一起使用,则会禁止使用默认尾随换行符,并且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
给出一个空的空白行,然后在该shell后面提示$,这意味着$ a有\ n表示一个新的空白行。这是预期和完美的。
如果没有\ n是$ a,则shell提示符$将出现在连续行中,并且不会出现空白行。