我知道......一个很小的基本问题,但我找不到“-S”正在测试什么?
BORG_SOCKET="${BORG_SOCKET:-/run/borg.sock}"
if ! [[ -S $BORG_SOCKET ]]; then
echo "err: borg socket does not exist" >&2
exit 10
...
答案1
[[...]]
是一个外壳结构。[[
, 和]]
是 shell 语法中的保留字,其中 shell 理解一种称为 的微语言形式条件表达式。
[
该语言与传递给或实用程序的参数组成的语言相似,但在许多微妙的方面有所不同test
。
您可以在 shell 手册中查找其文档。该[[...]]
构造最初来自 Korn shell,并被 bash 和 zsh 复制,尽管它们之间存在差异。
为了bash
,请参阅条件结构节点您可以通过以下方式获取系统上安装的版本的配置:
info -n 'conditional constructs' bash
其中将描述[[...]]
操作员,您会在其中找到指向Bash 条件表达式节点它描述了内部理解的微语言。或者您可以通过以下方式直接访问该节点:
info -n 'Bash Conditional Expressions' bash
在那里,您会发现:
-S文件
为真,如果文件存在并且是一个套接字。
以便:
echo "err: borg socket does not exist" >&2
有点误导,应该是:
echo "err: borg socket does not exist or is not a socket" >&2
尽管严格来说,这甚至应该是:
echo "err: borg socket does not exist or I can't determine whether it's a socket or not" >&2
答案2
从man test
:
-S FILE 文件存在并且是一个套接字
答案3
-S
测试给定路径是否存在并且是套接字(链接文件test
,但[[
-S
操作符具有相同的含义)。前面的内容!
否定了测试的意义。