使用 curl 将新事件插入 CalDAV 日历

Inserting new event into CalDAV calendar using curl

我知道如何使用 curl 将新事件插入到 CalDAV 日历中,前提是该事件通过之前的命令保存为本地 ics 文件:

$command > $localfile
curl -T "$localfile" $url

效果很好,但我想在不需要本地文件的情况下执行此操作,我想将 $command 的结果通过管道传输到 curl,如下所示:

$command | curl -T - $url

根据 curl 的手册,选项 "T -" 应该是必需的:它应该从标准输入而不是文件中读取。但是如果我使用那个选项,我会得到这样的回应:

<?xml version="1.0" encoding="utf-8"?>
    <d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
      <s:exception>Sabre\DAV\Exception\Conflict</s:exception>
      <s:message>PUT is not allowed on non-files.</s:message>
    </d:error>

我尝试了不同的其他参数,如“--data”和“--data-raw”,但我还没有找到正确的组合。有人可以帮我吗?


实际上,我试图实现的完整命令循环如下所示:

cat<<EOC | curl -T - $url 
BEGIN:VCALENDAR
VERSION:2.0

BEGIN:VEVENT
CREATED:${CREATED}
UID:${RNDUID}
CLASS:PUBLIC
CATEGORIES:TV
SUMMARY:${SUMMARY}
LOCATION:${LOCATION}
DTSTART:${DTSTART}
DTEND:${DTEND}
DESCRIPTION:${DESCRIPTION}
END:VEVENT

END:VCALENDAR
EOC

我尝试了 "echo" 而不是 "cat",但这并没有改变结果。

尤里卡! :)

解决方案是使用 HERE 文档:

$CURL $url -T /dev/stdin <<-EOF
        BEGIN:VCALENDAR
        VERSION:2.0
        BEGIN:VEVENT
        CREATED:$CREATED
        UID:$RNDUID
        SUMMARY:$SUMMARY
        LOCATION:$LOCATION
        DTSTART:$DTSTART
        DTSTAMP:$DTSTART
        DTEND:$DTEND
        DESCRIPTION:$DESCRIPTION
        END:VEVENT
        END:VCALENDAR
EOF

注意输入参数"/dev/stdin"!当 "-"(破折号)用于输入时,curl 参数 "-T" 在那里不起作用。您必须改用 "/dev/stdin" ,不幸的是,它在所有类 Unix 系统上都不可用。在 Linux 上,它可以用作 "-" 的替代品,当程序不支持选项 "-" 或者破折号对它们有不同的含义时,比如标记所有的结尾输入参数。

"<<"之后的"-"是HERE文档命令的一部分:它取消了制表符,但没有空格,因此文档可以以更友好的方式排列。

我还没弄明白

有什么区别
cat<<EOF | curl ...
...
EOF

我现在找到的解决方案,除了这第一次尝试之外,显然是对 cat 的无用使用。但它看起来很像 "cat" 带来了一些叫 "curl" 的老狗不太喜欢的东西。 ;)

如果有人对此有解释,我将非常感谢。