它是关于一个迭代工作的程序 - 从标准输入获取输入并将结果传递到标准输出。有一组已知文本需要传递给该程序,我已将它们放入一个文件中begin.txt
。所以我可以设置一个管道
cat begin.txt - | myprogram
问题稍后出现 - 如果我想发送我已经输入的内容(稍加修改),箭头不起作用,因为其中没有历史记录cat
- 因此,我正在寻找能够保留每行历史记录的东西。
最初我尝试使用vim
and:.! myprogram
但在执行条目(传递的文本)后myprogram
退出,然后其状态丢失。我需要一种方法来保持程序正常运行,直到传递我的文本/命令。
- 是否可以
vim
以这种连续的方式在管道中充当过滤器的方式运行?
答案1
使用rlwrap
。该rlwrap
实用程序包装您使用它的任何实用程序,以便它获取 ReadLine 历史记录(以及一些 ReadLine 编辑功能,例如您在提示中习惯的功能bash
)。它将把历史记录存储在下面的文件中$RLWRAP_HOME
(或者$HOME
如果未设置该变量)。
有了rlwrap
,你就可以做到
rlwrap cat begin.txt - | myprogram
下次运行此程序时,您将拥有一个基本历史记录,您可以使用您Up-arrow和Down-arrow按键滚动查看该历史记录。历史记录默认存储在~/.cat_history
.
有关详细信息,请参阅rlwrap
( )的手册。man rlwrap
答案2
cat begin.txt - << EOF
Type the
text you want
here, terminated by a line with only
EOF
看https://stackoverflow.com/q/2500436有关其工作原理的更多详细信息。
您在此期间输入的所有内容都将存储在 bash 历史记录中,因此您可以根据自己的喜好对其进行编辑。
如果您想要更灵活的东西,为什么不直接创建一个临时文件并对其进行编辑呢?
cat begin.txt > /tmp/myprograminput
editor /tmp/myprograminput
cat /tmp/myprograminput | myprogram