跑步时
/usr/bin/borg info --last 1 --json ${repo} | jq -r '.archives | first | .end' | python3 -c "import arrow, sys ; print(arrow.get(sys.stdin.read()).isoformat())" > /etc/local/borg-lastrun-${repo}-${tobackup}.txt
我明白了
/etc/local/borg.sh: line 27: /etc/local/borg-lastrun-${repo}-${tobackup}.txt: ambiguous redirect
(${repo}
并${tobackup}
设置)
歧义在哪里?
我怀疑这可能是jq
代码('.archives | first | .end'
),因为引号(?)内外有多个管道,但我不确定(如果是这种情况,也不知道如何修复它)
在 Bash 中,未加引号的变量(例如
${repo}
or$repo
)的值会经历分词和文件名生成。这意味着通常一个未加引号的变量可以生成多个单词。或更少; 如果它未设置或为空,那么它将生成零个单词。> ${repo}
在类似or的重定向的情况下> $repo
,任何数量的单词,但一个是错误的。从技术上讲,以下可能是有效的(但不是):如果它是有效的,那么最后一行将等同于
这是有效的,相当于
如果故意这样做,将参数(此处:)隐藏
baz
在看起来像重定向(此处:)的内容> $foo
中将是一种不好的做法,或者如果无意中进行,则可能是有害的错误。Bash 不允许你这样做。(实际上我怀疑这并不是因为 Bash 关心,而是因为它的解析器是如何工作的:我认为它会及早识别重定向,将它们与实际命令分开,并且进程有点不连贯。将参数注入命令会很麻烦,而不是值得麻烦。但这是我的猜测。)
该手册明确指出[强调我的]:
这是您得到的“模糊重定向”错误。说明书上说“不止一个字”;测试表明在“零字”(变量为空或未设置)的情况下会发生相同的错误。
正确的字数是一。这也适用于涉及许多变量的情况,例如在您的
/etc/local/borg-lastrun-${repo}-${tobackup}.txt
. 该字符串不能扩展到零个单词,但是(取决于变量的值)它可以扩展到多个单词。确保字符串被解释为单个单词的正确方法是双引号:在代码的其他部分,无论您在何处使用 variables,双引号几乎总是正确的做法。在某些情况下,您可以省略引号。您不应该引用的情况相对较少。
单引号是另一种防止分词的方法,但由于它也防止变量扩展(实际上:任何扩展),它在我们的例子中根本没有用。