linux - 重定向子shell的输出并同时通过管道处理

标签 linux bash shell sh

tl;dr: 需要一种方法来处理(使用 grep)子 shell 中的输出并同时将所有原始输出重定向到主 stdout/stderr。我正在寻找独立于 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 和 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/

相关文章:

bash - 删除第一列包含小写字母的行

bash - 如何在 if 语句中使用位运算符?

linux - 如何在 MSBuild 中获取当前操作系统?

linux - WordPress 安装权限被拒绝,ubuntu

python - 从包含唯一分子标识符的 Fastq 文件中删除 PCR 重复项

linux - 如何转义作为 shell 脚本中命令的关键字?

linux - 将 shell 脚本的输出重定向到文本文件

c - UNIX shell 段错误

python-3.x - Python 中 CPU 使用情况的拆分结果

linux - 多个 X 服务器上的 x11/xlib XCreateSimpleWindow