Bash 如何在UNIX中抑制来自失败重定向的错误消息?
我试图让我的代码返回文件Bash 如何在UNIX中抑制来自失败重定向的错误消息?,bash,unix,Bash,Unix,我试图让我的代码返回文件gold中的行数,如果文件不存在,则返回0。稍后我将有另一行代码,它可能会创建文件gold,但我不希望显示错误消息,说文件不存在 lrwxrwx 1用户无3月27日01:00 X->/dev/null wc-l~/X/blank | | echo 0 当代码保持原样时,它返回错误消息,然后返回0 $ wc -l< ~/PA2/rooms/treasureRoom/gold 2> ~/X/blank || echo 0 -bash: /home/User/PA2
gold
中的行数,如果文件不存在,则返回0
。稍后我将有另一行代码,它可能会创建文件gold
,但我不希望显示错误消息,说文件不存在
lrwxrwx 1用户无3月27日01:00 X->/dev/null
wc-l<~/PA2/rooms/treasureRoom/gold 2>~/X/blank | | echo 0
当代码保持原样时,它返回错误消息,然后返回0
$ wc -l< ~/PA2/rooms/treasureRoom/gold 2> ~/X/blank || echo 0
-bash: /home/User/PA2/rooms/treasureRoom/gold: No such file or directory
0
$wc-l<~/PA2/rooms/treasureRoom/gold 2>~/X/blank | | echo 0
-bash:/home/User/PA2/rooms/treasureRoom/gold:没有这样的文件或目录
0
如何抑制显示错误?我认为这是脚本的一部分,在这种情况下,您可以使用shell函数:
function line_count {
typeset filename="$1"
if [[ -a "$filename" && -f "$filename" ]]
then
wc -l < "$filename"
else
echo 0
fi
}
在一个组中放置带有您希望静音的重定向的代码,并为整个命令组重定向stderr
{ wc -l <~/PA2/rooms/treasureRoom/gold; } 2>/dev/null || echo 0
{wc-l/dev/null | | echo 0
为什么不仅要使用-f
?如果文件不存在,它将返回false,因此没有理由使用前面的-a
。另外,请注意re:function关键字中最后一个表中的条目。顺便说一句,可以将>文件作为自己的命令运行,其结果与touch
类似,但性能开销较小(因为不需要涉及shell外部的可执行文件)。@CharlesDuffy至于-f
并省略-a
,您是对的。关于函数
关键字,我使用的语法是您链接的图表中的第二种替换语法。这更现代,而且在使用其他shell时也更现代(ksh,可能是zsh)函数
语法在这些shell中使用了不同且更可取的变量作用域行为。您使用的语法是第一个图表中的第二个替换;我的目的是提请您注意第三个图表。如果需要局部变量,唯一可靠的方法是显式声明它们。(即使在ksh中,函数
更改了排版
的含义,因此仍然需要使用排版
;最好在最新的shell中使用更便携的路径,并使用本地
,这甚至支持POSIX标准声明语法的ash和dash)。
{ wc -l <~/PA2/rooms/treasureRoom/gold; } 2>/dev/null || echo 0