我有一个命令将加密的 gpg 流传输到curl中:
echo "Some Text" | gpg -o - | curl --silent -T - \
-X PUT \
--output /dev/null \
${myurl} \
运行这个时,我看到类似的东西
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0Enter passphrase
Passphrase:
其中该"Enter passphrase"
部分附加到curl 输出的发送。由于事物的管道性质,我无法插入换行符。有没有办法让curl输出稍后运行?
答案1
如何防止卷曲输出打印前一个管道的输出?
curl
不打印“前一个管道的输出”。发生的事情是curl
将gpg
一些消息打印到您的终端。这些消息相互干扰。
请记住管道命令同时运行。
如果您希望成功的输出gpg
永远不会为空,那么使用ifne
:
… | gpg … | ifne curl …
(在 Debian 中ifne
是在moreutils
包中。)
的主要目的ifne
是防止命令(此处curl
:)在标准输入为空时运行。要知道标准输入是否真的为空,该工具需要等待任何数据或 EOF。这会延迟实际的命令。延迟就是你所需要的。
我希望gpg
只有在获得正确的密码后才开始打印。我没有ifne
对前面gpg
询问密码进行彻底测试,但我确实对sudo …
询问密码进行了测试。如果gpg
按我的预期工作,那么ifne
可以帮助你。它将curl
在您提供密码后运行。
如果不向标准输出打印任何内容(例如,因为密码错误),Noteifne
将阻止curl
运行。gpg
通常需要这种行为。但是,如果 success 的输出gpg
可以为空并且仍然应该通过管道传输到curl
,那么ifne
单独使用就不是正确的选择。
如果您想运行curl
而不管是否gpg
打印任何内容,请继续阅读。
下面的代码是我的report
脚本的简化版本这个答案。将其另存为delay
.
ifne
它以更复杂的方式使用。该代码必须是可执行脚本(我的意思是不要尝试将其设为 shell 函数),因为它通过调用自身ifne "$0"
(并且ifne
无法运行函数)。
#!/bin/bash
if [ "$1" = "-X" ]; then
marker=1
fd="$2"
shift 2
else
unset marker
exec {fd}>&1
fi
if [ "$marker" ]; then
( >&"$fd" "$@" )
else
ifne -n "$0" -X "$fd" "$@" | ifne "$0" -X "$fd" "$@"
fi
的目的delay
是延迟命令的执行,直到标准输入中有数据或EOF。它被设计为在 后使用|
。
你应该像这样使用它:
… | gpg … | delay curl …
curl
gpg
仅在开始打印到其标准输出或因任何原因关闭后运行。
一些技术细节在已经链接的答案。
ifne foo
、ifne -n foo
和之间的区别delay foo
:
ifne foo
等待数据或 EOF,然后foo
在有数据时运行,ifne -n foo
等待数据或 EOF,然后运行foo
iff 没有数据,delay foo
等待数据或EOF,然后foo
无条件运行。