我知道如何使用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”,但这并不能改变结果。
2条答案
按热度按时间6fe3ivhb1#
我找到了!:)
解决方案是使用HERE文档:
注意输入参数
"/dev/stdin"
!curl参数"-T"
在这里不起作用,当"-"
(破折号)用于输入。您必须使用"/dev/stdin"
来代替,遗憾的是,并不是所有的类Unix系统都可以使用"/dev/stdin"
。在Linux上,它可以用来替代"-"
,当程序不支持"-"
选项或者破折号对它们有不同的含义时,例如标记所有输入参数的结束。"<<"
后面的"-"
是HERE文档命令的一部分:它抑制了制表符,但没有空格,因此文档可以以更直观的方式排列。我还没弄明白
而我现在找到的解决办法,除了这第一次尝试之外,显然是对猫的无用使用。但它看起来很像是“猫”带来了一种叫“ curl ”的老狗不太喜欢的东西。)
如果有人对此有一个解释,我将非常感谢。
hsvhsicv2#
如果您的shell允许,您可以简单地使用进程替换
<(
:<($command)
将被一个临时文件描述符(/dev/fdXX
)所替换,该描述符传递$command
的输出。然后,curl
将能够像读取常规文件一样读取它。