如何在单行代码中将变量赋值时的错误重定向至/dev/null
问题描述
我无法在以下代码中将预期错误重定向至/dev/null:
xml=`ls ./XML_30fps/*.xml ./XML_24fps/*xml`
预期错误是当其中一个文件夹为空时,会出现“No such file or directory”提示,我不希望用户看到该错误。我可以通过拆分代码解决,但想知道是否有单行代码的简便重定向方法。以下两种写法均无效:
xml=`ls ./XML_30fps/*.xml ./XML_24fps/*xml` &>/dev/null
xml=`ls ./XML_30fps/*.xml ./XML_24fps/*xml &>dev/null`
解决方案
正确的单行写法
你需要把错误重定向放在反引号内部的ls命令末尾,并且补全/dev/null的路径:
xml=`ls ./XML_30fps/*.xml ./XML_24fps/*.xml 2>/dev/null`
或者用更现代的$()语法(推荐,可读性更好,支持嵌套):
xml=$(ls ./XML_30fps/*.xml ./XML_24fps/*.xml 2>/dev/null)
为什么之前的写法无效
- 第一种写法
xml=ls ...&>/dev/null:错误重定向作用于整个赋值语句,而非反引号内部的ls命令,所以ls产生的错误依然会输出到控制台。 - 第二种写法漏了
/dev/null的斜杠,会把错误输出到当前目录下的dev/null文件而非系统空设备;即使补全斜杠,&>在部分旧版bash中的兼容性也不如直接指定标准错误流的2>/dev/null。
额外安全提示
用ls捕获文件名存在潜在问题(比如文件名含空格、换行符等特殊字符时会出错),更安全的写法是用bash通配符直接赋值:
shopt -s nullglob xml=(./XML_30fps/*.xml ./XML_24fps/*.xml)
nullglob选项会让空通配符返回空列表,而非保留原字符串,从根源避免“No such file or directory”错误,同时数组能正确处理带特殊字符的文件名。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

