同时将子shell的输出和处理通过管道传递

3

tl;dr:需要一种处理子shell输出并将所有原始输出同时重定向到主stdout/stderr的方法。(可以使用grep)我正在寻找不依赖于shell的解决方案。

详细信息:

  1. 存在一个专有二进制文件,我想要用grep查找其中某个值。

  2. 这个专有二进制文件可能会在某些时候要求用户输入密码(取决于内部逻辑)。

  3. 我想要对二进制文件的输出进行grep,并且希望能够在需要输入密码时输入密码以继续进行后续操作。

因此,实现我的任务的脚本可能如下所示:

#!/bin/sh
user_id=... # some calculated value

list_actions_cmd="./proprietary-binary --actions ${user_id}"
action_item=$(${list_actions_cmd} | grep '^Main:')

这里的proprietary-binary可能通过stdin要求输入密码。由于$()中的子shell捕获了所有输出,最终用户将无法理解list_actions_cmd等待输入。我想要的是同时显示list_action_cmd的所有输出和进行关键字匹配,或者至少捕获现在用户将被要求输入密码的关键字,并让他知道这一点。
目前我想到的方法是使用tee命令将输出重定向并在其中进行关键字匹配:
#!/bin/sh
user_id=... # some calculated value

list_actions_cmd="./proprietary-binary --actions ${user_id}"
$list_actions_cmd 2>&1 | tee /tmp/.proprietary-binary.log
action_item=$(grep "^Main" /tmp/.proprietary-binary.log)

但我想知道是否有一种优雅的与shell无关的解决方案(不仅限于功能强大的bash),而且没有任何中间临时文件?谢谢。

你应该阅读Bash FAQ 050 - chepner
@chepner,读什么能帮我解决问题?“阅读常见问题”可能是所有问题的通用答案。我看了一下,但没有找到解决我的问题的模式。 - nebd
它并没有回答你的问题。它解释了为什么list_actions_cmd="..."是错误的方法。 - chepner
1个回答

2

如果在终端执行,是否将输出复制到stderr:

item=$(your_command | tee /dev/stderr | grep 'regexp')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接