静音脚本文件中的系统错误消息并显示我的错误消息

静音脚本文件中的系统错误消息并显示我的错误消息

我创建了一个简单的脚本,用于将当前工作目录中所有带有后缀的文件移动.sh到指定目录

如果没有这样的文件,脚本应该只输出我输入的错误消息,而不是系统错误消息:mv: cannot stat ‘*.sh’: No such file or directory

我尝试在命令 put./shm 2> /dev/null之后添加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 丢失时,每个文件都将作为一个文件移动到那里并覆盖前一个文件。

如果文件或文件夹名称中有空格,则需要引号。

相关内容