如何防止卷曲输出打印前一个管道的输出?

如何防止卷曲输出打印前一个管道的输出?

我有一个命令将加密的 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不打印“前一个管道的输出”。发生的事情是curlgpg一些消息打印到您的终端。这些消息相互干扰。

请记住管道命令同时运行


如果您希望成功的输出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 …

curlgpg仅在开始打印到其标准输出或因任何原因关闭后运行。

一些技术细节在已经链接的答案


ifne fooifne -n foo和之间的区别delay foo

  • ifne foo等待数据或 EOF,然后foo在有数据时运行,
  • ifne -n foo等待数据或 EOF,然后运行foo​​iff 没有数据,
  • delay foo等待数据或EOF,然后foo无条件运行。

相关内容