我有一个程序,当从命令行调用时,它从标准输入读取。通常用户会输入一些信息,在新行上按C-d表示文件结束,程序将处理该文件。然后再次提示用户,输入更多文本,再按C-d表示第二个文件的结束。
我正在寻找一个shell脚本,它将调用该程序并自动提交这两个文件。我想做这样的事情:
$ myprogram < file1.txt < file2.txt
OR
$ myprogam <file1.txt file2.txt
有什么建议吗?我在Linux下使用bash shell。
答案 0 :(得分:3)
显然你可以使用cat
将两个文件发送到程序标准输入中,但这可能不是你想要的:
$ cat file1.txt file2.txt | myprogram
在上述情况下,myprogram
无法告知file1.txt
结束和file2.txt
的开始位置,除非他们具有特定的格式,并且正在观看特定格式的流文件的结尾或开头。
没有标准方法可以将多个流发送到标准输入。基本上只有一个流进入标准输入。
您可能会构建脚本,以便它在命令行上接受多个参数,并在内部打开并一次处理一个。也就是说,你会这样称呼它:
$ myprogram file1.txt file2.txt
答案 1 :(得分:2)
是否必须进行1次调用?如果不是:
for file in file1 file2 file3; do myprogram < $file; done
答案 2 :(得分:0)
可能要做的就是使用expect。
答案 3 :(得分:0)
Jonathan Leffler在评论中说,我的解决方案不正确。也许是。我其实没有仔细检查过。但是,至少在这里只是为了获取信息,这是一个错误的答案。
Bash可以使用echo
命令回显控制字符。正如您已经注意到的,EOF
是C-d
,所以让我们使用子shell:
$ ( cat file1.txt ; echo -e '\cD' ; cat file2.txt ) | myprogram
这将在括号内执行命令并将它们的输出管道化,就好像它是一个单独的程序一样。
如果您不确定它是否正确管道,请尝试以下方法:
$ (echo "Hello" ; echo -e '\cD' ; echo "bash") | tee
答案 4 :(得分:0)
我编写了一个简单的Python程序来模拟您描述的程序的行为。至少,这使我们所有人都能够谈论同样的事情,而不是假设你的程序如何运作。 (当然,如果你的程序实际上没有像我在这里描述的那样工作,请纠正我。)
#!/usr/bin/python
def read_a_file():
print('Type the contents of a file now.')
while True:
try:
s = raw_input('>')
except EOFError:
break
read_a_file()
read_a_file()
print('We have now read two files. Quitting.')
您可以运行此脚本,键入第一个文件的内容,按CTRL-D,键入第二个文件的内容,按CTRL-D,然后程序退出。这似乎是您所描述的行为。
我的第一个想法是使用期望,正如混乱所暗示的那样。但是,我无法找到任何支持将文件内容传递给进程。 (我假设文件的内容每次都不同。如果它们是相同的,那么只要将文件的内容放在expect脚本中,期望就可以了。)
我应该注意到,我绝不是期待专家;可能有一种方法可以做到这一点对我来说并不明显。
我的第二个想法是编写一个启动程序的Python脚本,并为其提供文件内容和EOF字符。然而,Jonathan Leffler的评论让我觉得回应EOF角色是行不通的。
我的第三个想法是非常该死的kludgy。您可以编写一个脚本,通过将文件内容插入到expect脚本中,然后执行expect脚本来创建expect脚本。我怀疑这会奏效。