| grep:无法打开| grep:无法打开grep

时间:2018-03-29 14:08:54

标签: linux bash

FILTER="grep -w PROD | grep -v PROD_OPL"

if (/usr/ucb/ps auxww | grep $1/$2 | $FILTER > /dev/null)
then
  #do something
fi

给出输出:

grep: can't open |
grep: can't open grep
grep: can't open -v
grep: can't open PROD_OPL
grep: can't open |
grep: can't open grep
grep: can't open -v
grep: can't open PROD_OPL

我该如何解决这个问题? $FILTER需要充满活力。

2 个答案:

答案 0 :(得分:1)

要存储命令供以后使用,您需要使用函数。

这是一个执行两个特定grep命令的基本示例:

function filter() { 
    grep -w PROD | grep -v PROD_OPL
}

if (/usr/ucb/ps auxww | grep $1/$2 | filter > /dev/null)
then
  #do something
fi

grep $1/$2的输出通过管道传递给函数的输入,该函数将其传递给它的管道,管道的输出传递给函数的输出。

函数的返回代码隐式地保留为其最后一个命令之一,因此只有当过滤器匹配某些行时,if条件才为真。

就动态性而言,可以在任何时候重新定义该功能,因此您可以根据需要重新定义过滤器。一个更好的解决方案可能是参数化该函数,以便它根据需要实现所需的过滤器。

我需要更多输入来提供足够的功能(或者甚至可能是足够的grep命令,正则表达式可以很强大...)但是你可以设想一个过滤不包含前缀参数的行的函数由!和所有其他人。

答案 1 :(得分:-1)

我相信发生了很多错误,因为bash无法将|解释为管道,因为它只是FILTER内的一个字符。因此,您需要将$FILTER实际评估为表达式。例如,尝试

FILTER="grep -w PROD | grep -v PROD_OPL"

if /usr/ucb/ps auxww | grep $1/$2 | eval "$FILTER" > /dev/null
then
  #do something
fi

修改

正如各种评论中明确指出的那样:这很可能不是你应该解决问题的方式。执行字符串作为代码是不好的,可能是危险的设计。 也就是说,如果您完全控制FILTER的内容,那么就可以成为一个不错的黑客。