shell 如何创建错误转到/dev/null的变量[duplicate]

lo8azlld  于 2023-01-31  发布在  Shell
关注(0)|答案(2)|浏览(128)
    • 此问题在此处已有答案**:

How to avoid printing an error in the console in a BASH script when executing a command?(1个答案)
16小时前关门了。
这篇文章是编辑和提交审查2小时前。
我无法在下面的简单代码中将预期错误重定向到&〉/dev/null。

xml=`ls ./XML_30fps/*.xml ./XML_24fps/*xml`

预期的错误是由于其中一个文件夹可能为空,因此错误将是"没有这样的文件或目录"。我不希望此错误显示给用户。
我可以通过分解这行代码来解决这个问题,但我想知道在这种情况下,是否有一个简单的方法可以用单行代码重定向到null。
x一个一个一个一个x一个一个二个x
这个链接How to avoid printing an error in the console in a BASH script when executing a command?有点触及这一点,但它不像我的问题和这里给出的答案那样清楚。

55ooxyrt

55ooxyrt1#

在subshell中重定向它:

xml=`exec 2>/dev/null; ls ./XML_30fps/*.xml ./XML_24fps/*xml`

或者

xml=$(exec 2>/dev/null; ls ./XML_30fps/*.xml ./XML_24fps/*xml)
fdbelqdn

fdbelqdn2#

用一个不写stderr的替代命令替换你的命令怎么样?

xml=()
if [ -d XML_24fps ]; then
  xml+=($(find XML_24fps -maxdepth 1 -type f -name '*.xml'))
fi
if [ -d XML_30fps ]; then
  xml+=($(find XML_30fps -maxdepth 1 -type f -name '*.xml'))
fi
echo ${xml[@]}

在上面的代码中,我们使用find来定位子文件夹中的所有*.xml文件,我们设置了一个保护条件,这样我们就不会在不存在的文件夹中运行find
注意到XML_24fpsXML_30fps非常相似,区别仅在于2430,我们可以使用{24,30}展开式重构上述内容,如下所示:

xml=()
for d in XML_{24,30}fps
do
  if [ -d $d ]; then
    xml+=($(find $d -maxdepth 1 -type f -name '*.xml'))
  fi
done
echo ${xml[@]}

相关问题