我正在执行
eb deploy my_env,
之后,命令行中显示了相当多的文本,我想 grep
表示 “更新成功完成”
完成后 上述命令,如果未找到,则返回退出状态 1。
我想知道这怎么可能。
(如果您对原因感兴趣,我发现尽管部署失败,但 eb 部署仍返回退出状态 0)
最佳答案
这是管道用途的教科书案例:
eb deploy my_env | grep "update completed successfully"
如果你想抑制 grep
的输出,使用-q
旗帜。结果就像eb deploy
一样有一个实际上符合您需求的错误代码:
eb deploy my_env | grep -q "update completed successfully"
正如您在评论中提到的,eb deploy my_env
实际上可以是包含 "update completed successfully"
的任何其他命令管道最终输出中的某处。整个管道的返回值将是grep
的返回值。 ,是最后一个命令。
这种类型的管道实际上是 UNIX 设计的基本原则。理想情况下,UNIX 命令是执行一项单一功能且性能良好的小块。这个想法是,将一些强大的模块连接在一起比编写一个完成所有操作的非常复杂的程序要容易得多。
有趣的更新
您实际上可以看到 eb deploy
的原始输出并仍然使用grep
以确定返回代码。最简单的方法(更好地说明链式管道)是使用 process substitution ,可在 bash
中找到。 , ksh
和zsh
:
eb deploy my_env | tee >(cat) | grep -q "update completed successfully"
tee
会将输出复制到文件和 stdout
。 stdout
将通过管道传输到 grep
像之前一样。我们不指定文件,而是使用子进程 >(<a href="http://linuxcommand.org/man_pages/cat1.html" rel="noreferrer noopener nofollow">cat</a>)
,它只会将输出打印到命令行。
对于其他更便携的方法,请参阅this post有关更多信息,请参阅 Unix/Linux 堆栈交换。
关于bash - 在终端中执行命令后如何 grep 查找特定文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44161728/