2015-07-19 92 views
0

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

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

这是在我的.bashrc。首先,它是猫的用户名/密码文件,然后管道到pianobar(终端中的潘多拉)。用户名和密码进入,但是,pianobar期待更多的输入。 Pianobar要求输入一个数字(例如,可以播放,例如,电台),但是当我键入并按Enter键时,由于某种原因,没有发生任何事情,因此它并不期望它来自那里。

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

注:我也曾尝试

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

回答

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脚本。我可以编写脚本,但我不知道应用程序提供的登录提示。

+1

我会用'猫;回声;猫| BASE64;猫; } | pianobar'而不是这个来避免不必要的'echo -e'等。 –

+0

^^同意。我也有同样的意见。我只是希望对OP的脚本进行微小的更改。但编辑也给了这个解决方案。 – anishsane

+0

使用'expect'脚本实际上更确定地以与真实TTY输入相同的方式工作 - 如果程序在isatty(stdin)的返回值上改变其行为,则'cat'黑客可能无法工作。 –