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

관련 정보