Linux 在bash脚本中将文本回显到多个文件

Linux 在bash脚本中将文本回显到多个文件,linux,bash,stdout,Linux,Bash,Stdout,我正在编写一个bash脚本,它使用pssh运行外部命令,然后将命令的输出与每个服务器的IP连接起来。pssh有一个选项-o,用于将每个服务器的文件写入指定的目录,但是如果命令不运行,则只有一个空文件。我遇到的问题是使用类似“服务器不可访问”的内容更新这些空文件,以便我知道到达服务器时存在连接问题,并且不会导致脚本的其余部分出现问题 以下是我到目前为止的情况: #!/bin/bash file="/home/user/tools/test-host" now=$(date +"%F") fol

我正在编写一个bash脚本,它使用pssh运行外部命令,然后将命令的输出与每个服务器的IP连接起来。pssh有一个选项-o,用于将每个服务器的文件写入指定的目录,但是如果命令不运行,则只有一个空文件。我遇到的问题是使用类似“服务器不可访问”的内容更新这些空文件,以便我知道到达服务器时存在连接问题,并且不会导致脚本的其余部分出现问题

以下是我到目前为止的情况:

#!/bin/bash

file="/home/user/tools/test-host"

now=$(date +"%F")
folder="./cnxhwinfo-$now/"
empty="$(find ./cnxhwinfo-$now/ -maxdepth 1 -type f -name '*' -size 0 -printf '%f%2d')"
command="echo \$(uptime | awk -F'( |,|:)+' '{d=h=m=0; if (\$7==\"min\") m=\$6; else {if (\$7~/^day/) {d=\$6;h=\$8;m=\$9} else {h=\$6;m=\$7}}} {print d+0,\"days\",h+0,\"hours\",m+0,\"minutes\"}'),  \$(hostname | awk '{print \$1}'), \$(sudo awk -F '=' 'FNR == 2 {print \$2}' /etc/connex-release/version.txt), \$(lscpu | awk -F: 'BEGIN{ORS=\", \";} NR==4 || NR==6 || NR==15 {print \$2}' | sed 's/ *//g') \$(free -k | awk  '/Mem:/{print \$2}'), \$(df -Ph | awk '/var_lib/||/root/ {print \$2,\",\"\$5,\",\"}')"

pssh -h $file -l user -t 10 -i -o /home/user/tools/cnxhwinfo-$now -x -tt $command
echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"

ls ./cnxhwinfo-$now >> ./cnx-data-$now
cat ./cnxhwinfo-$now/* >> ./cnx-list-$now
paste -d, ./cnx-data-$now ./cnx-list-$now >>./cnx-data-"$(date +"%F").csv"
我试图使用“查找”来查找空文件,并使用tee写入不可用的服务器,如下所示:

echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"
如果指定的文件夹不存在,则会出现以下错误:

tee:./cnxhwinfo-2019-09-03/:是一个目录

如果它确实存在,即,我再次运行脚本,它将创建一个以find命令返回的IP地址命名的文件,如下所示:

192.168.1.2 192.168.1.3 192.168.1.4 1

我也试过:

echo "Server Unreachable" | tee <(./cnxhwinfo-$now/$empty)
find命令在一行上输出IP地址,每行之间有一个空格,因此我认为tee可以使用它,但我觉得我要么遇到语法问题,要么走错了方向。我有这个脚本的另一个版本,它使用常规ssh,效果很好,只是比使用pssh慢得多。

empty应该是一个数组,假设所有文件名中都不包含任何空格

readarray -t empty < <(find ...)

echo "Server unreachable" | (cd ./cnxhwinfo-$now/; tee "${empty[@]}" > /dev/null)

否则,您将通过连接空文件名来构建单个文件名。

谢谢!我以前没有使用过数组,但这很有效:readarray-t empty