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

f2uvfpb9  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(189)

我知道如何使用curl将新事件插入CalDAV日历,如果事件被前面的命令保存为本地ics文件:

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

这很好用,但我想在不需要本地文件的情况下完成,我想将$命令的结果通过管道传输到curl中,类似于:

$command | curl -T - $url

根据curl的手册,选项“T -”应该是所需的:它应该从stdin而不是从一个文件中读取。但是如果我使用这个选项,我会得到这样的响应:

<?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”,但这并不能改变结果。

6fe3ivhb

6fe3ivhb1#

我找到了!:)
解决方案是使用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系统都可以使用"/dev/stdin"。在Linux上,它可以用来替代"-",当程序不支持"-"选项或者破折号对它们有不同的含义时,例如标记所有输入参数的结束。
"<<"后面的"-"是HERE文档命令的一部分:它抑制了制表符,但没有空格,因此文档可以以更直观的方式排列。
我还没弄明白

cat<<EOF | curl ...
...
EOF

而我现在找到的解决办法,除了这第一次尝试之外,显然是对猫的无用使用。但它看起来很像是“猫”带来了一种叫“ curl ”的老狗不太喜欢的东西。)
如果有人对此有一个解释,我将非常感谢。

hsvhsicv

hsvhsicv2#

如果您的shell允许,您可以简单地使用进程替换<(

curl -T <($command) $url

<($command)将被一个临时文件描述符(/dev/fdXX)所替换,该描述符传递$command的输出。然后,curl将能够像读取常规文件一样读取它。

相关问题