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

関連情報