为什么双引号会影响linux中这些echo语句的打印?

Hun*_*nle 8 unix linux shell ps echo

我正在捕获输出ps aux:

current_processes=`ps aux | grep "tempdir" | tail -3`
Run Code Online (Sandbox Code Playgroud)

当我回应它时,它看起来像这样

echo $current_processes
19984 10089 17784
Run Code Online (Sandbox Code Playgroud)

当我echo加双引号时,它看起来像这样:

echo "$current_processes"
19984 
10089
17784    
Run Code Online (Sandbox Code Playgroud)

当我使用双引号但没有双引号时,为什么将它们放在新行上?

cle*_*ens 4

效果来自外壳。如果没有双引号,shell 会用空格替换换行符、制表符和空格。您可以使用双引号避免这种替换。有关更多详细信息,请参阅Word Splitting手册页中的部分:bash(1)

分词

shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。

shell 将 IFS 的每个字符视为分隔符,并将其他扩展的结果拆分为这些字符上的单词。如果 IFS 未设置,或其值恰好为默认值,则任何 IFS 字符序列都可用于分隔单词。如果 IFS 具有默认值以外的值,则只要空白字符位于 IFS 值(IFS 空白字符)中,单词开头和结尾处的空白字符 space 和 tab 序列就会被忽略。IFS 中非 IFS 空白的任何字符以及任何相邻的 IFS 空白字符共同界定字段。IFS 空白字符序列也被视为分隔符。如果IFS的值为空,则不会发生分词。

IFS你可以看到with的内容echo "$IFS" | xxd。它会告诉你

00000000: 2009 0a0a                                 ...
Run Code Online (Sandbox Code Playgroud)

这意味着空格 (0x20)、制表符 (0x09) 和换行符 (0x0a)。第二个 0x0a 来自 echo 命令。

您可以通过设置IFS为空字符串来避免这种替换:

IFS=""
echo "$current_processes"
19984 
10089
17784
Run Code Online (Sandbox Code Playgroud)

但我不会推荐这个。