我有 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)
在zsh
和ksh
导数中,您可以使用 的快捷方式cat
:
PID=$(< /usr/local/foo/var/run/foo.pid 2>/dev/null)
在 中bash
,您可以使用a=$(<file)
但不能使用a=$(<file 2>/dev/null)
。
答案2
一般来说,您可以在尝试使用test
aka[
命令读取文件之前检查该文件是否存在:
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 用户实际上是否有权读文件。