已解决!使用curl

问题描述 投票:0回答:1
将新事件插入CalDAV日历中

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

$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”,但这不会改变结果。

curl stdin caldav
1个回答
0
投票

尤里卡! :)

解决方案是使用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"!当将"-T"(破折号)用作输入时,卷曲参数"-"在此处不起作用。您必须改为使用"/dev/stdin",但遗憾的是,该功能并非在所有类似Unix的系统上都可用。在Linux上,当程序不支持选项"-"或破折号对它们有不同的含义(例如标记所有输入参数的末尾)时,可以用作"-"的替代。

"-"之后的"<<"是HERE文档命令的一部分:它禁止制表符,但不包含空格,因此可以以更友好的方式排列文档。

我还没有弄清楚]之间有什么区别>

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

以及我现在发现的解决方案,除了第一次尝试,显然是对猫的无用使用。但是它看起来非常像“猫”带来的东西,叫做“卷曲”的老狗不太喜欢。 ;)

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

© www.soinside.com 2019 - 2024. All rights reserved.