bash中的printf有时打印新行,can';我不明白为什么

bash中的printf有时打印新行,can';我不明白为什么,bash,printf,newline,Bash,Printf,Newline,如果我有一个包含以下内容的文件: 127.0.0.1 127.0.0.2 127.0.0.3 8.8.8.8 127.0.0.4 并运行此命令以快速测试SSH连接成功或失败: while read host do ssh -n -q -o BatchMode=yes -o ConnectTimeout=5 $host "echo 2>&1" && \ printf "%-15s%-45s%s" `id -un` $host "SSH_OK" || \ pri

如果我有一个包含以下内容的文件:

127.0.0.1
127.0.0.2
127.0.0.3
8.8.8.8
127.0.0.4
并运行此命令以快速测试SSH连接成功或失败:

while read host
do
 ssh -n -q -o BatchMode=yes -o ConnectTimeout=5 $host "echo 2>&1" && \
 printf "%-15s%-45s%s" `id -un` $host "SSH_OK" || \
 printf "%-15s%-45s%s" `id -un` $host "SSH_BAD"
done <host_list
正如您所看到的,它看起来很糟糕,因为它没有为SSH_错误输出或最后一行打印换行符,所以bash提示符被标记到最后一次检查的末尾

我可以通过在prinf中添加一个
\n
来解决这个问题,但是除了坏行之外,我在所有内容上都有两个空格

有人能告诉我,当我没有指定换行符时,printf从哪里获取换行符,以及为什么它为SSH_OK行而不是SSH_BAD行打印一个换行符

有没有好的/简单的方法来解决这个问题

多谢各位
fLo

换行符来自您在远程系统上运行的
echo 2>&1
。当
ssh
成功时,将执行此命令,并在
printf
之前打印一个换行符。当
ssh
失败时,命令不会运行,因此在
printf
之前没有换行符

我建议您使用一个不显示任何内容的命令,然后将
\n
放在两行
printf
中:

while read host
do
 ssh -n -q -o BatchMode=yes -o ConnectTimeout=5 $host "true" && \
 printf "%-15s%-45s%s\n" `id -un` $host "SSH_OK" || \
 printf "%-15s%-45s%s\n" `id -un` $host "SSH_BAD"
done <host_list
读取主机时
做
ssh-n-q-obatchmode=yes-o ConnectTimeout=5$host“true”和\
printf“%-15s%-45s%s\n”`id-un`$host“SSH|u OK”|\
printf“%-15s%-45s%s\n”`id-un`$host“SSH\u坏”

完成新行来自
echo 2>&1
。当
ssh
成功时,它会打印一个换行符,但当
ssh
失败时,它不会执行任何操作。我认为您没有正确解释输出(尽管我不能给出正确的解释)。但是新行显然没有打印在SSH_OK输出行的末尾,否则您将看不到这种行为。它们似乎是在SSH_OK行的开头打印的,而不是SSH_BAD行的开头。而且@Barmar刚刚给了我我所缺少的部分。因此,正如我所说,换行符在SSH_OK输出行之前打印,而不是在SSH_BAD行之前打印。+1用于catch,但对于
true
命令,您可能不需要
2>&1
。如果您想捕获并剥离所有潜在的输出,您可能需要执行
true>/dev/null 2>&1
while read host
do
 ssh -n -q -o BatchMode=yes -o ConnectTimeout=5 $host "true" && \
 printf "%-15s%-45s%s\n" `id -un` $host "SSH_OK" || \
 printf "%-15s%-45s%s\n" `id -un` $host "SSH_BAD"
done <host_list