【问题标题】:bash read stdin after piped inputbash 在管道输入后读取标准输入
【发布时间】:2015-10-08 17:42:03
【问题描述】:

我无法让 bash 放弃对标准输入的管道控制。我想将用户名和密码传递给程序,然后从标准输入而不是管道读取相同的程序!这是我尝试过的:

alias pandora='echo -e "$(cat ~/.musik/name)\n$(cat ~/.musik/pass | base64 --decode)" | pianobar'

这是我的.bashrc。首先,它是用户名/密码文件,然后通过管道将其输入pianobar(终端中的潘多拉)。用户名和密码在那里,但是,pianobar 期待更多的输入。 Pianobar 要求输入一个数字(以便能够播放,例如,station 12),但是当我输入并按 Enter 时,什么也没有发生,因为出于某种原因,它没有预料到它会出现从那里开始。

如何让管道“放弃”控制权?

注意:我也试过

echo "$(cat ~/.musik/name)
$(cat ~/.musik/pass | base64 --decode) 
" >>> pianobar

【问题讨论】:

    标签: bash


    【解决方案1】:

    您可以尝试 2 个选项:

    简单的方法:(可能不适用于所有类型的命令(如本例中的钢琴条)

    alias pandora='{ echo -e "$(cat ~/.musik/name)\n$(cat ~/.musik/pass | base64 --decode)"; cat; } | pianobar'
    

    或者对UUOC进行一点清理和删除:

    alias pandora='{ cat ~/.musik/name; base64 --decode < ~/.musik/pass; cat; } | pianobar'
    

    更好的方法:使用expect 脚本。我本可以编写脚本,但我不知道您的应用程序给出的登录提示。

    【讨论】:

    • 我会选择{ cat; echo; cat | base64; cat; } | pianobar 而不是这个,以避免不必要的echo -e
    • ^^ 同意。我也有同样的看法。我只是更喜欢对 OP 的脚本进行最小的更改。但编辑也给出了该解决方案。
    • 使用expect 脚本实际上更有把握以与真正的 TTY 输入相同的方式工作——如果程序在 isatty(stdin) 的返回值上改变其行为,cat hack可能不起作用。
    • ^^ 对。但isatty(stdin) 通常用于登录阶段。如果 Op 的现有代码允许使用重定向的 stdin 登录,那么很可能(不确定),next cat 也会工作......
    • 啊,所以我确实需要它来放弃控制,因为它可能需要读取的不仅仅是一个输入。有两个问题:(1)你必须按回车键(钢琴条会像原始模式一样读取键输入); (2) 输入不止一个……所以我可以做while : ; do cat; done 我猜……有什么想法吗?
    【解决方案2】:

    这是配置pianobar自动登录的正确方法:

        mkdir ~/.config/pianobar/ && cd ~/.config/pianobar/ && touch config
    

    在命令行中运行 ^^^,然后将以下内容放入新的配置文件中

        # User
        user = (Your Pandora email)
        password = (Your Pandora password)
    

    https://github.com/PromyLOPh/pianobar/blob/e945578ab22912049f1e547ce7b25b01089f7590/contrib/config-example

    【讨论】: