如何在 bash 脚本中的流水线命令之间插入延迟。例如。猫文件 |远程登录 mail.domain.com 25
Posted
技术标签:
【中文标题】如何在 bash 脚本中的流水线命令之间插入延迟。例如。猫文件 |远程登录 mail.domain.com 25【英文标题】:How to insert a delay between pipelining commands in a bash script. E.g. cat file | telnet mail.domain.com 25 【发布时间】:2013-10-19 23:01:58 【问题描述】:我有一个创建文件的 bash 脚本,我想在最后通过 telnet 发送一封电子邮件。但是有时它会执行,有时它不会。
最后的命令是
cat tempfile | telnet mail.domain.com 25
在接收服务器失败时,我在 mail.log 中看到以下错误:
improper command pipelining after EHLO from domain.com ....etc
如果我在 localhost 中启动 telnet 会话而不是 mail.domain.com,则相同的脚本可以完美运行,因此我很确定文件格式正常,并且 bash 脚本的其余部分也可以正常工作。
我也尝试过使用标准重定向而不是管道
telnet mail.domain.com 25 < tempfile
但结果有时是好的有时不是。我认为重定向和 telnet session 命令之间需要有一个小的延迟,以便在 telnet 会话建立并给出响应后给出输入,但我不知道该怎么做。我尝试在管道和重定向之间使用 sleep 命令,但它可能不起作用,因为输入被重定向到 sleep 命令。
e.g. cat tempfile | telnet mail.domain.com 25 & sleep 1
限制是我必须在 bash 脚本中执行此操作。可能吗?另外我不知道它是否重要,但脚本用于在 debian 挤压中的服务器之间使用 postfix/courier 设置工作,现在接收端使用 debian wheezy 和 postfix/dovecot 设置。
提前感谢您的帮助
【问题讨论】:
【参考方案1】:你可以试试这样的:
(echo -n; sleep 5; cat tempfile) | mail.domain.com 25
要打开连接并且什么都不写,等待 5 秒再写剩下的。
【讨论】:
echo -n; sleep 5; cat tempfile; | ...
会避免不必要的子shell。
非常感谢您的快速响应:) 这完美无瑕。即使没有 echo -n 它仍然会等待 5 秒,然后再写入其余部分。我从没想过将它包含在()中。我用 尝试过,它仍然有效,所以两个答案都很好。但是对于 我必须使用 echo -n;【参考方案2】:
如何在 bash 脚本中的流水线命令之间插入延迟
如果您希望每条管道都有延迟,请使用:
cat tempfile | while read l ; do sleep 1; echo $l; done | awk 'print $2'
假设tempfile
内容如下:
line1 content1
line2 content2
line3 content3
上面的命令将打印:
line1
line2
line3
每秒打印每一行。
您还可以在名为delay-piped-line
的脚本文件中添加 while read l ; do sleep 1; echo $l; done
,以便您像这样使用它:
cat tempfile | delay-piped-line | awk 'print $2'
【讨论】:
以上是关于如何在 bash 脚本中的流水线命令之间插入延迟。例如。猫文件 |远程登录 mail.domain.com 25的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AutoHotkey 中的 SendInput 命令之间添加延迟?
执行 bash 脚本时隐藏 Gitlab 管道日志中的变量值
解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?