停止发布 grep 消息

Stop grep message from posting

我正在编写一个带有 1 个字符串参数和一个文件的脚本。我想要它,以便如果放入一个不存在的文件,那么它将显示“文件名 无法读取”消息。

该部分确实有效,但它也会显示 "grep: grep.txt: No such file or directory" 消息。如果第一个 if 语句为真,有什么方法可以阻止 grep 消息发布和结束脚本?

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

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

你可以在 grep 命令中添加 /dev/null 它会抑制错误部分。

grep ""  2>/dev/null

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

2> file 将 stderr 重定向到文件

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

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

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

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

grep "" 2>/dev/null

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

然而,这引入了竞争条件:如果文件在您的脚本作为 运行 时消失,当您检查它是否存在时它可能仍然存在,但在 grep 运行时消失了.

您可以通过检查退出状态来处理...

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

恕我直言,在这个例子中最好只让 grep 打印错误。