以下脚本中的脚本 2>/dev/null 有什么用?

以下脚本中的脚本 2>/dev/null 有什么用?
$!/bin/sh
if grep "$1" /etc/passwd 2>/dev/null               #Search username at beging of line1
then
         echo "Pattern found - Job Over"
else 
         echo "Pattern not found"

fi

答案1

在bash中,1表示stdout,2表示stderr(标准错误流)

/dev/null 是一个虚拟设备,您可以向其中写入任何内容,并且它将消耗所有内容(本质上是消除输出)。

因此,2> /dev/null这意味着将此命令的错误输出重定向到 /dev/null。本质上的意思是,去掉错误消息

答案2

目的2>/dev/null是隐藏通过grep将任何诊断消息重定向到/dev/null(丢弃写入其中的数据的特殊设备文件)而产生的错误。

/etc/passwd文件通常可供所有用户读取,因此我不太明白为什么需要重定向错误流。但是,由于代码grepif语句中使用,实用程序可能产生的输出(匹配 的行$1)可能是不需要的,并且>/dev/null此输出将被丢弃。因此,我建议2代码中的 是一个拼写错误,作者打算写

#!/bin/sh

if grep -e "$1" /etc/passwd >/dev/null; then
    echo "Pattern found - Job Over"
else 
    echo "Pattern not found"
fi

也就是说,对于echo任一字符串,同时丢弃匹​​配的实际行。-e如果字符串$1以破折号开头,则需要。另请注意更正后的#!- 行。

这也可以在没有任何重定向的情况下完成:

#!/bin/sh

if grep -q -e "$1" /etc/passwd; then
    echo "Pattern found - Job Over"
else 
    echo "Pattern not found"
fi

一旦找到匹配项就会退出,并且也会使其安静(它不输出匹配的行 )-qgrep


如果这是grep为了用户名/etc/passwd,然后使用

if getent passwd "$1" >/dev/null; then ...; fi

会是一个更好的选择,因为使用纯文本grep可能会找到包含字符串作为$1子字符串的用户名,除非您小心地正确编写表达式(正则表达式实际上并未显示在问题中)。getent passwd如果在数据库中找不到给定的用户名,则该命令将以非零退出状态退出passwd

这也适用于使用 NIS 或 LDAP 数据库存储用户信息的系统,但会不是在 macOS 上工作(无getent实用程序)。

相关内容