停止发布grep消息

时间:2019-09-20 00:19:28

标签: linux shell posix

我正在处理一个带有1个字符串参数和一个文件的脚本。我想要这样,如果放置的文件不存在,则会显示“ 文件名无法读取”消息。

该部分确实起作用,但是它还会显示“ grep:grep.txt:无此类文件或目录”消息。如果第一个if语句为true,是否可以阻止grep消息发布和结束脚本?

#! /bin/sh
if [ ! -f "$2" ]
then
    echo "$0" cannot be read 1>&2
fi

if [ $# -eq 2 ]
then
    grep "$1" $2
else
    echo there is more or less than 2 arguments 1>&2
fi

3 个答案:

答案 0 :(得分:0)

您可以在grep命令中添加/ dev / null,它将消除错误部分。

grep "$1" $2 2>/dev/null

>运算符通常将输出重定向到文件,但可以重定向到设备。您还可以使用>>进行追加。

2> file将stderr重定向到文件

/ dev / null是空设备,它将接收您想要的任何输入并将其丢弃。可用于抑制任何输出。

答案 1 :(得分:0)

使用非零退出代码退出脚本以指示失败,并阻止脚本继续进行到grep

if [ ! -f "$2" ]
then
    echo "$0" cannot be read 1>&2
    exit 1
fi

答案 2 :(得分:0)

您可以重定向grep中的所有错误,例如:

grep "$1" $2 2>/dev/null

2>表示重定向标准错误,与>1>的标准输出相反)。

但是,这引入了竞争条件:如果文件在脚本运行时消失了,那么当您检查文件是否存在时该文件可能仍然存在,但是在grep运行时就消失了。

您可以通过检查退出状态来解决此问题...

grep "$1" $2 2>/dev/null
if [[ $? -gt 1 ]]; then
  echo "grep failed unexpectedly" >&2
fi

恕我直言,在此示例中,最好让grep打印错误。