Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在UNIX中抑制来自失败重定向的错误消息?_Bash_Unix - Fatal编程技术网

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