我正在寻找一个命令,它首先通过给定的
命令
,然后使用给定的
提示字符串
要输入一行(具有readline功能),请将输入的行导入该进程,然后重复。进程的任何输出都打印在提示符行上方的行上,以防止出现混乱,因此提示符始终是屏幕上的最后一行,但进程可以随时输出某些内容。
例如,提示命令
prompt -p "> " cat
运行cat,在输入每一行之前都有提示。它看起来像这样:
$ prompt -p "> " cat
> hello
hello
> every time it's time for me to type, there's a prompt!
every time it's time for me to type, there's a prompt!
> for sure
for sure
也许您还可以为命令的输出指定一个提示符,如下所示:
$ prompt -p "[IN] " -o "[OUT] " grep hi
[IN] hello
[IN] this is another example
[OUT] this is another example
[IN] it sure is, i'm glad you know
我找到了rlwrap(
https://github.com/hanslub42/rlwrap
)并且它似乎使用读行功能进行行缓冲,但没有输入提示符。
基本上,我想要一个命令,它可以将在输入流上运行的任何命令转换为友好的repl。
这
几乎
工作,但只要流程输出了什么,光标就会出现在错误的位置:
CMD="grep hi" # as an example
prompt () {
while true
do
printf "> \033\067"
read -e line || break
echo $line > $1
done
}
prompt >(stdbuf -oL $CMD |
stdbuf -oL sed 's/^/< /' |
stdbuf -oL sed 's/^/'`echo -ne "\033[0;$(expr $(tput lines) - 1)r\033[$(expr $(tput lines) - 1);0H\033E"`'/;s/$/'`echo -ne "\033[0;$(tput lines)r\033\070\033M"`'/')
为了清楚起见,这里有另一个例子。想象一下一个简单的irc客户端命令,它从stdin读取命令并将简单消息输出到stdout。它没有任何接口,甚至没有提示符,它只是直接从stdin和stdout读取并打印:
$ irc someserver
NOTICE (*): *** Looking up your hostname...
NOTICE (*): *** Found your hostname
001 (madeline): Welcome to someserver IRC!! madeline!madeline@somewhere
(...)
/join #box
JOIN (): #box
353 (madeline = #box): madeline @framboos
366 (madeline #box): End of /NAMES list.
hello!
<madeline> hello!
(5 seconds later)
<framboos> hii
使用提示符命令,它看起来更像这样:
$ prompt -p "[IN] " -o "[OUT] " irc someserver
[OUT] NOTICE (*): *** Looking up your hostname...
[OUT] NOTICE (*): *** Found your hostname
[OUT] 001 (madeline): Welcome to someserver IRC!! madeline!madeline@somewhere
(...)
[IN] /join #box
[OUT] JOIN (): #box
[OUT] 353 (madeline = #box): madeline @framboos
[OUT] 366 (madeline #box): End of /NAMES list.
[IN] hello!
[OUT] <madeline> hello!
(5 seconds later)
[OUT] <framboos> hii
[IN]
关键是生成了一个进程,您输入的每一行都被管道连接到同一个进程中,它不会为每一行生成新的进程。还请注意,[IN]提示符不会被来自framboos的消息所干扰,而是将消息打印在行上
在上面
提示。上面提到的rlwrap程序正确地做到了这一点。我所能知道的唯一缺少的是提示字符串。