Bash 循环和文本编辑器

Bash 循环和文本编辑器

我有几个服务器,它们都有一个我想监控的日志文件。因为这个项目是新的,而且到目前为止大多数错误都是独一无二的,所以我想手动监控这些日志一段时间。我希望通过将所有要监控的 IP 放在一个文本文件中,然后做一些简单的操作来节省一点时间,例如:

#!/bin/bash
while read ip; do
    scp user@"$ip":/var/log/file.log ./
    nano -w file.log
    rm -f file.log
done < ips.txt

然而,Nano(和 Vi)完全失控了,因为 Bash 循环似乎没有等我退出它们就继续执行下一个命令。

如何让 Bash 循环等待我退出文本编辑器后再继续?请随意从技术角度解释答案;我问这个问题的部分原因是我对 Bash 了解不够,不知道为什么会发生这种情况,但我很想知道。

答案1

我想我知道是什么了。因为你将输入重定向到 while 循环,所以 nano 不再在其标准输入中看到你的终端。尝试替换

nano -w file.log

nano -w file.log < /dev/tty

答案2

考虑...

#!/bin/bash
while read ip; do
    scp user@"$ip":/var/log/file.log ./
    nano -w file.log && rm -f file.log
done < ips.txt

&&等待命令成功完成(返回 0)然后再执行其右边的语句。

编辑:哎呀,实际运行命令后,@glennjackman 是对的。另外,如果你想学习一些 bash 的东西,可以考虑阅读TLDP 的初学者 BashTLDP 的高级 Bash

答案3

将其包装在以下调用中time

例子:

time nano -w file.log

会有一些输出喷涌而出,我想如果你愿意的话,你可以将其重定向到 /dev/null,但是“时间”应该被认为仍在运行,这与编辑器的行为方式不同。

相关内容