tl;dr: 需要一种方法来处理(使用 grep)子 shell 中的输出并同时将所有原始输出重定向到主 stdout/stderr。我正在寻找独立于 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
和 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-independent(不限于非常强大的 bash)解决方案?谢谢。
最佳答案
如果在终端中执行,如何将输出复制到 stderr:
item=$(your_command | tee /dev/stderr | grep 'regexp')
关于linux - 重定向子shell的输出并同时通过管道处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43909507/