Bashスクリプトでエラーを抑制する方法

Bashスクリプトでエラーを抑制する方法

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 
$ 

おすすめ記事