shell stderr 到 /dev/null

shell stderr 到 /dev/null

我有 PID 文件,我想获取 PID 号,所以这就是我正在做的事情。

[root@linux ~]# PID=`cat /usr/local/foo/var/run/foo.pid`
[root@linux ~]# echo $PID
3414

有时这个文件不存在并且抛出文件错误,我想指定如果文件不存在则不抛出错误。

[root@linux ~]# PID=`cat /usr/local/foo/var/run/foo.pid`
cat: /usr/local/foo/var/run/foo.pid: No such file or directory

我正在尝试使用2&> /dev/null但它不起作用,我做错了什么?

答案1

首先,开始使用$()命令替换,而不是旧的、有问题的 ``。

在您的情况下,cat当 STDERR 流(文件描述符 2)上不存在该文件时,将显示错误消息。

使用命令 susbstution 您只需将 STDOUT 上的内容保存到变量中PID。因此,要在文件不存在时消除错误消息,请将文件描述符 2 重定向到/dev/null

PID=$(cat /usr/local/foo/var/run/foo.pid 2>/dev/null)

zshksh导数中,您可以使用 的快捷方式cat

PID=$(< /usr/local/foo/var/run/foo.pid 2>/dev/null)

在 中bash,您可以使用a=$(<file)但不能使用a=$(<file 2>/dev/null)

答案2

一般来说,您可以在尝试使用testaka[命令读取文件之前检查该文件是否存在:

if [ -f /usr/local/foo/var/run/foo.pid ]; then
    PID=$(cat /usr/local/foo/var/run/foo.pid)
fi

或者如果你更喜欢单行:

[ -f /usr/local/foo/var/run/foo.pid ] && PID=$(cat /usr/local/foo/var/run/foo.pid)

在 POSIX shell 中,使用该-f选项将返回

如果路径名解析为常规文件的现有目录条目,则为 True。如果路径名无法解析,或者路径名解析为非常规文件的现有目录条目,则返回 False。

-r测试可能更合适,因为它还检查 shell 用户实际上是否有权文件。

相关内容