dateコマンドで生成されたエラーを抑制しようとしましたが、スクリプトを実行した後もエラーが発生します。
#!/usr/bin/bash
input="30 FEB 2022"
reg="^[0-9]{1,2}\s[a-zA-Z]{1,3}\s[0-9]{1,4}$"
if [[ $input =~ $reg ]]
then
echo "VALID Date Format : $input"
#output=$(`date -d "$input" +"%d-%b-%Y, %A"` 2>&1 > /dev/null)
output=`date -d "$input" +"%d-%b-%Y, %A"` 2>&1 > /dev/null
else
echo "INVALID Date Format : $input"
output="-1"
fi
echo $output
実行後の出力 -
root@ip-xx-x-xx-xxx:~# ./exDate.sh
VALID Date Format : 30 FEB 2022
date: invalid date '30 FEB 2022'
エラーを抑制する方法を教えてください。
ベストアンサー1
より良い方法を提供する回答がすでにあるので、あなたが要求した質問にのみ答えます。エラーメッセージが引き続き表示されるのは、リダイレクトの順序が重要なためです。リダイレクトは左から右に読み込まれるため、2>&1 > /dev/null
「最初にstderrをstdoutにリダイレクトしてから」を意味します。それからstdoutを/dev/null
「にリダイレクトします。これはエラーがstdoutとして印刷され、通常のstdoutがにリダイレクトされることを意味します。stdout/dev/null
を次にパイプすることでこれを確認できますwc
。
## No redirection
$ date -d foo
date: invalid date ‘foo’
## Nothing is printed to stdout, the error goes to stderr
## and wc has nothing to count
$ date -d foo | wc
date: invalid date ‘foo’
0 0 0
## Redirect using 2>&1 > /dev/null
$ date -d foo 2>&1 > /dev/null
date: invalid date ‘foo’
## The error is now being printed to stdout, wc counts it
$ date -d foo 2>&1 > /dev/null | wc
1 4 29
あなたが望むのは、標準出力を/dev/null
最初の出力にリダイレクトし、それからstderrをstdoutにリダイレクトします> /dev/null 2>&1
。期待どおりに動作します。
$ date -d foo > /dev/null 2>&1
$