与硬编码字符串相比,打印命令输出时 bash 中的不同行为

Different behaviour in bash when printing output from command compared to hardcoded string

我正在尝试使用 tmux 和简单的 bash 脚本在我的终端中获得一个非常基本的状态栏 - 所以 windows 非常小(1 或 2 行高度可能小于宽度为 10 个字符)。

导致异常行为的命令是:

echo "$(top -bn 1 | awk '/^%Cpu/{print }')%"

这基本上只是应该打印出类似 1.8% 的内容。 在正常大小的终端(有或没有 tmux)中它工作正常但是当我缩小终端时,在某个时候它开始切断数字并且只显示 %。这可能看起来不太奇怪,但是当我在这个命令周围放置一些文本时,比如

echo "ab$(top -bn 1 | awk '/^%Cpu/{print }'cd"

我在缩小终端时得到 abcd 作为输出。所以它只影响 $(...) 被切掉的部分。

当我打印两行时:

echo "$(top -bn 1 | awk '/^%Cpu/{print }'%"
echo "20.5%"

它会打印 20.5% 很好,甚至将它分成几行,如

2
0
.
5
%

而不是不打印它的一部分。但是第一行只显示 % 而没有任何数字。

知道是什么原因造成的以及如何显示数字吗?

默认情况下,top 检查终端大小并根据它调整输出,即使在批处理模式下使用并且输出通过管道传输而不是进入终端。您可以使用 -w 选项来覆盖它。

echo "$(top -w 50 -bn 1 | awk '/^%Cpu/{print }')%"