【发布时间】:2017-05-11 07:50:31
【问题描述】:
tl;dr: 需要一种方法来处理(使用 grep)子外壳内的输出,并将所有原始输出同时重定向到主 stdout/stderr。我正在寻找独立于外壳(!)的方式。
详细说明
有一个专有的二进制文件,我想用 grep 获取一些值
专有二进制文件有时可能是交互式的以询问密码(取决于内部逻辑)
我想对二进制文件的输出进行 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 的所有输出和 grepping,要么至少捕获现在用户将被要求输入密码并让他知道的关键字。
目前我想出的是tee输出和grep那里:
#!/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,阅读如何帮助我解决这个问题? “阅读常见问题解答”可能是所有问题的通用答案。我在那里看了看,但没有找到解决我问题的模式。
-
它没有回答你的问题。它解释了为什么
list_actions_cmd="..."是错误的方法。