スクリプトファイルのシステムエラーメッセージをミュートし、私のエラーメッセージを表示します。

スクリプトファイルのシステムエラーメッセージをミュートし、私のエラーメッセージを表示します。

現在の作業ディレクトリのサフィックスを含むすべてのファイルを指定.shされたディレクトリに移動する簡単なスクリプトを作成しました。

これらのファイルがない場合、スクリプトはシステムエラーメッセージではなく、私が入力したエラーメッセージのみを出力する必要があります。mv: cannot stat ‘*.sh’: No such file or directory

./shm 2> /dev/nullputコマンドの後に追加しようとしたので、mvスクリプトは無限に実行されました!

システムエラーメッセージを無音にする方法は?

#!/bin/bash

echo "Moving all script files to script directory..."
mv *.sh $HOME/linux/scripts
#./shm 2> /dev/null
if [ $? -ne 0 ]
 then
        echo "No files with .sh suffix"
fi

答え1

私はこれがエラーメッセージを取り除く誤った方法だと思います。私のような場合は、確認に使用する方が良いです。

#!/bin/bash

if ls *.sh &> /dev/null
then
  echo "Moving all script files to script directory..."
  mv -v -n *.sh $HOME/linux/scripts
else
  echo "No files with .sh suffix -- nothing to move"
fi

答え2

以下のスクリプトは、カスタムエラーメッセージを表示するのに役立ちます。

#!/bin/bash

files=$(ls *.sh 2> /dev/null)

if [ -z "$files" ]
then
    echo "No script files found. Exiting.."
    exit
fi

echo "Moving all script files to script directory..."

for file in $files
do
    if ! mv $file $HOME/linux/scripts
    then
        echo "Unable to move file $file"
    fi
done 

"*.sh"スクリプトが実行されると、スクリプトの現在の作業ディレクトリにあるファイルのリストが変数にfiles割り当てられます。

$files次に、変数が空であることを確認するために、完全性チェックを実行します。空の場合、"*.sh"ディレクトリにファイルがないことを意味します。

ファイルが存在する場合、forループは$files変数を繰り返して各ファイルを移動します。コマンドが失敗すると、mvエラーが印刷されます。

forループの詳細については、次を参照してください。このファイル。

答え3

2>/dev/nullmvコマンドを追加してstderrを/ dev / nullにリダイレクトします。

mv *.sh $HOME/linux/scripts 2>/dev/null

答え4

CostasまたはKannanに関する他の解決策:

if ! mv $file $HOME/linux/scripts

と交換する必要があります

if ! mv "$file" "$HOME/linux/scripts/."

また、スクリプトの先頭にこの行を追加してください。

 mkdir -p "$HOME/linux/scripts"

それ以外の場合、linux / scriptsが見つからない場合は、各ファイルが1つに移動され、古いファイルが上書きされます。

ファイルまたはフォルダ名にスペースが含まれている場合は、引用符が必要です。

関連情報