通过标准输入从shell脚本提交多个文件

时间:2009-09-28 14:23:11

标签: linux redirect shell

我有一个程序,当从命令行调用时,它从标准输入读取。通常用户会输入一些信息,在新行上按C-d表示文件结束,程序将处理该文件。然后再次提示用户,输入更多文本,再按C-d表示第二个文件的结束。

我正在寻找一个shell脚本,它将调用该程序并自动提交这两个文件。我想做这样的事情:

$ myprogram < file1.txt < file2.txt

OR

$ myprogam <file1.txt file2.txt

有什么建议吗?我在Linux下使用bash shell。

5 个答案:

答案 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命令回显控制字符。正如您已经注意到的,EOFC-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脚本。我怀疑这会奏效。