【问题标题】:Redirect output from subshell and processing through pipe at the same time重定向子shell的输出并同时通过管道处理
【发布时间】:2017-05-11 07:50:31
【问题描述】:

tl;dr: 需要一种方法来处理(使用 grep)子外壳内的输出,并将所有原始输出同时重定向到主 stdout/stderr。我正在寻找独立于外壳(!)的方式。

详细说明

  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(不限于非常强大的 bash)解决方案而没有任何中间临时文件?谢谢。

【问题讨论】:

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

标签: linux bash shell sh


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2021-06-03
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多