tl;dr:需要一种处理子shell输出并将所有原始输出同时重定向到主stdout/stderr的方法。(可以使用grep)我正在寻找不依赖于shell的解决方案。
详细信息:
存在一个专有二进制文件,我想要用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
的所有输出和进行关键字匹配,或者至少捕获现在用户将被要求输入密码的关键字,并让他知道这一点。目前我想到的方法是使用
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),而且没有任何中间临时文件?谢谢。
list_actions_cmd="..."
是错误的方法。 - chepner