【问题标题】:Ubuntu got EPIPE error when using -q flag with grepUbuntu 在 grep 中使用 -q 标志时出现 EPIPE 错误
【发布时间】:2016-03-27 22:44:34
【问题描述】:

我有一个 bash 脚本,用于检查某些永久进程是否正在运行。脚本基本上是:

#!/bin/bash

processIsRunning=$(forever list | grep -q 'process/index.js')
if [ -n $processIsRunning]; then
    echo 'Processes are running'
else 
    echo 'Processes are not running'
fi

我得到了这个错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: write EPIPE
    at errnoException (net.js:904:11)
    at Object.afterWrite (net.js:720:19)

如果我从第 3 行的 grep 命令中删除了“-q”标志,那么我不会收到管道错误,而是会收到一个错误,提示它尝试将 grep 结果作为命令运行,而不是仅仅检查输出的长度大于 0。 有谁知道为什么 -q 参数会导致 EPIPE 错误?

根据评论更新: 我的错误,我对 bash 很陌生,并且正在尝试学习如何使用 if 语句。我最初将它直接放在 if 语句中,但因为它不起作用(结果它失败了,因为我没有空格,没有意识到它们是 bash 中的要求)。我显然没有正确地将其移植出来。我目前只使用不带 -q 的 grep,然后检查输出的长度,效果很好。

【问题讨论】:

  • 首先,grep -q 不输出任何内容,因此尝试通过$(...) 捕获其输出是没有意义的。使用方式类似于if forever list | grep -q 'process/index.js'; then
  • 第二,我无法重现问题 - forever list 是否成功完成写入终端,一个没有-qgrep 进程,一个带有-qgrep 进程,一个文件..

标签: linux bash grep


【解决方案1】:

试试这样的:

forever list | grep -q 'process/index.js'
if [ $? -eq 0 ]; then
    echo 'Processes are running'
else 
    echo 'Processes are not running'
fi

grep -q 表示不要向标准输出写入任何内容。

$?用于查找最后执行的命令的返回值。

【讨论】:

  • == 是非标准的,不应与[ 一起使用。无论如何,您都可以使用if forever list | grep -q 'process/index.js',而不是检查$?
  • 取点并编辑代码以反映这一点。你说的也对,如果永远列表| grep -q 'process/index.js' 也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
相关资源
最近更新 更多