如何检查文件系统上是否存在命名管道

5 bash test fifo mkfifo

我尝试使用 -f 标志来测试命名管道是否存在

if [[ ! -f "$fifo" ]]; then
  echo 'There should be a fifo.lock file in the dir.' > /dev/stderr
  return 0;
fi
Run Code Online (Sandbox Code Playgroud)

这个检查似乎不正确。那么也许命名管道不是文件,而是其他东西?

Ini*_*ian 5

您需要使用该-p构造来查看文件是否属于命名管道类型。它适用于标准测试[(符合 POSIX 标准)和扩展测试操作符[[(特定于 bash/zsh)

if [[ -p "$fifo" ]]; then
    printf '%s is a named pipe' "$fifo"
fi
Run Code Online (Sandbox Code Playgroud)

来自manbash 页面

-p file

如果file存在并且是命名管道 (FIFO),则为 True。

或使用file带有 的命令-b仅打印类型信息而不显示文件名。可能-b不符合 POSIX 标准

if [ $(file -b "$fifo") = "fifo (named pipe)" ]; then
   printf '%s is a named pipe' "$fifo"
fi
Run Code Online (Sandbox Code Playgroud)

没有-b, 人们可以做

type=$(file "$fifo")
if [ "${type##*: }" = "fifo (named pipe)" ]; then 
Run Code Online (Sandbox Code Playgroud)