为什么 2>/dev/null 不起作用?

为什么 2>/dev/null 不起作用?

我想在脚本开始时询问用户 sudo 密码,然后在运行脚本的其余部分之前测试该密码是否正确。

经过一段时间的搜索,我得到了这个测试脚本:

SUDO_PWD=whatever
sudo -k   # <- So I can test it
echo $SUDO_PWD | sudo -Svp '' 2>/dev/null 
sudo_response=$(SUDO_ASKPASS=/bin/false sudo -A whoami @>/dev/null) 
if [ "$sudo_response" = "root" ]; then 
    echo "sudo" 
else  
    echo "no sudo" 
fi 

但是,即使使用 @>/dev/null 重定向,这两条消息也会出现在控制台中。为什么 ?

答案1

如果您不想有任何输出(即没有标准输出且没有错误),则需要使用如下重定向:

your_command > /dev/null 2>&1
your_command &> /dev/null

仅显示错误并丢弃标准输出:

your_command > /dev/null

并仅显示标准输出并丢弃错误:

your_command 2> /dev/null

答案2

如果有人对检查 sudo 密码脚本的最终版本感兴趣,我将把它留在这里:

#!/bin/bash

echo "Informe superuser password:"
. getpass.sh
echo ""
sudo -k
echo $PASSWORD | sudo -Svp '' 2> /dev/null
SUDO_ANSWER=$(SUDO_ASKPASS=/bin/false sudo -A whoami 2> /dev/null)
if [ "$SUDO_ANSWER" != "root" ]; then
    echo "Invalid superuser password. Exiting."
    exit
fi
echo "Sudo password correct. Excuting rest of the script."

getpass.sh是我很久以前在互联网上得到的一个 bash 脚本,它在终端中获取一个密码,回显星号而不是字符。为了完整起见,我将代码留在这里:

#!/bin/bash
stty -echo
CHARCOUNT=0
while IFS= read -p "$PROMPT" -r -s -n 1 CHAR
do
    # Enter - accept password
    if [[ $CHAR == $'\0' ]] ; then
        break
    fi
    # Backspace
    if [[ $CHAR == $'\177' ]] ; then
        if [ $CHARCOUNT -gt 0 ] ; then
            CHARCOUNT=$((CHARCOUNT-1))
            PROMPT=$'\b \b'
            PASSWORD="${PASSWORD%?}"
        else
            PROMPT=''
        fi
    else
        CHARCOUNT=$((CHARCOUNT+1))
        PROMPT='*'
        PASSWORD+="$CHAR"
    fi
done
PROMPT=""
stty echo

相关内容