如何读取上一个命令的输出然后继续执行下一个命令

Posted

技术标签:

【中文标题】如何读取上一个命令的输出然后继续执行下一个命令【英文标题】:How to read the output of previous command and then proceed to the next command 【发布时间】:2019-05-10 06:01:10 【问题描述】:

我想写一个脚本,只有在上一个命令成功的情况下才会执行下一个命令。

作为脚本的一部分,我正在尝试添加文件。成功执行添加文件的命令后,我会收到如下消息:

May 10, 2019 5:57:12 AM com.ibm.ws.jmx.connector.client.rest.internal.RESTMBeanServerConnection findInitialEndpoint
INFO: CWWKX0230I: The collective member opened JMX client to the collective controller: ncr-aus-e171.corp.wayport.net:9081
May 10, 2019 5:57:12 AM com.ibm.ws.jmx.connector.client.rest.internal.RESTMBeanServerConnection findInitialEndpoint
INFO: CWWKX0230I: The collective member opened JMX client to the collective controller: ncr-aus-e171.corp.wayport.net:9081
Successfully pushed policy to server

收到“成功将策略推送到服务器”消息后,我希望脚本推送下一个文件。 (等等 50 个不同的文件)

谁能告诉我如何实现它?

【问题讨论】:

您能发布到目前为止您尝试过的内容吗?当前代码的示例? @Bindu:“成功执行”是什么意思?退出代码为零? 你想要grep -q "Successfully pushed policy to server" && echo "Next command"这样的东西吗? 是的 Walter grep 获取“成功将策略推送到服务器”消息并仅在收到上述消息时执行下一个命令 @user1934428,成功执行我的意思是如果我在命令的输出中收到“成功将策略推送到服务器”。 【参考方案1】:

试试这个:

#!/bin/bash
Commands=(
  "command1 parameter1 parameter2"
  "command2 parameter1"
  "command3 parameter1 parameter2 parameter3"
)

tmplog=$(mktemp)
for cmd in "$Commands[@]"; do
   echo "$cmd"
   $cmd >"$tmplog"
   tail -1 "$tmplog" | grep -v "^Successfully" && break
done
rm "$tmplog"

【讨论】:

如果命令需要几秒钟的时间才能执行,有没有办法等到收到成功消息后再选择下一个命令? 我尝试过睡眠,但在命令之间出现锁定解锁错误。 还有其他更好的方法吗? 我有一个数组中的命令:for cmd in "$Commands[@]";做 $cmd >"$policylog" sleep 50 tail -1 "$policylog" | grep -v "^Successfully" i=echo $? if [[ $i == 0 ]] then echo "failed added policy $cmd" exit else echo "successfully added policy $cmd" fi done 您的 grep 命令没有意义。因为模式后面的参数必须是文件名,并且您在名称为i=echo的文件中搜索单词Successfullygrep应该抱怨它没有找到文件。

以上是关于如何读取上一个命令的输出然后继续执行下一个命令的主要内容,如果未能解决你的问题,请参考以下文章

Redis 命令执行过程(下)

Redis 命令执行过程(下)

Java示例:如何执行进程并读取输出

如何在用户退出linux系统时使一个进程仍然继续执行

C#在'x'行后暂停流读取器输出然后继续

python如何实时获取命令行执行的输出