bash中的printf有时打印新行,无法找出原因

时间:2014-08-19 01:47:39

标签: 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" || \
 printf "%-15s%-45s%s" `id -un` $host "SSH_BAD"
done <host_list

我明白了:

myname   127.0.0.1                                    SSH_OK
myname   127.0.0.2                                    SSH_OK
myname   127.0.0.3                                    SSH_OKmyname   8.8.8.8                                      SSH_BAD
myname   127.0.0.4                                    SSH_OK[myname@server ~]$

正如您所看到的,它看起来很讨厌,因为它不会为SSH_BAD输出或最后一行打印新内容,因此bash提示被标记为上次检查结束。

我可以通过向prinf添加\n来解决这个问题,但是除了BAD行之外,我在所有内容上都有双倍空格。

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

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

谢谢你 FLO

1 个答案:

答案 0 :(得分:1)

新行来自您在远程系统上运行的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