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

时间:2017-05-11 07:50:32

标签: linux bash shell sh

tl; dr:需要一种方法来处理(使用grep)subshel​​l内的输出并同时将所有原始输出重定向到主stdout / stderr。我正在寻找与shell无关(!)的方式。

详细

  1. 有一个专有二进制文件,我想grep一些值

  2. 不时有专有二进制文件可能是交互式的,要求输入密码(取决于内部逻辑)

  3. 我想grep二进制文件的输出并希望能够输入进一步继续所需的密码

  4. 因此,应该实现我的任务的脚本可能如下所示:

    #!/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)解决方案没有任何中间临时文件?感谢。

1 个答案:

答案 0 :(得分:2)

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

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