【问题标题】:UNIX: How to run a program with a file as an inputUNIX:如何以文件为输入运行程序
【发布时间】:2012-05-28 08:35:13
【问题描述】:

我正在编写一个名为“run”的 bash 脚本,它使用预定义的输入测试程序。

它接受一个文件作为第一个参数,然后一个程序作为第二个参数。

电话看起来像

./run text.txt ./check

例如,程序“run”会以 text.txt 作为输入运行“check”。这将为我节省大量的程序测试时间。

我现在有

$2 < text.txt > text.created

所以它接受 text.txt 并将其作为输入重定向到指定的程序,这是第二个参数。然后将结果转储到 text.created 中。

我在 text.txt 中有输入,我知道输出应该是什么样子,但是当我 cat text.created 时,它是空的。

有人知道以文件为输入运行程序的正确方法吗?这对我来说似乎很直观,但是“检查”程序是否有问题,而不是我在“运行”脚本中所做的事情?

谢谢!任何帮助都将不胜感激!

编辑:文件 text.txt 包含多行文件,每行都有一个程序“检查”的输入。

也就是说,text.txt 可以包含

asdf1.txt asdf2.txt asdf3.txt

我想对每个文件 asdf1.txt、asdf2.txt、asdf3.txt 进行测试检查。

【问题讨论】:

  • 您所拥有的是运行以text.txt 作为标准输入 的程序的正确方法。你确定这是程序所期望的吗? (不同的节目有不同的期望,你知道吗?)
  • @dmckee 甜蜜!那么 text.txt 包含不带引号的“让我们去”,而“检查”需要两个参数。奇怪的是 text.created 中没有任何内容
  • 啊...将文件重定向到标准输入强调与使用文件的内容作为参数相同。回答跟随。
  • 我已经修改了我的答案 - 现在它使用参数,而不是标准输入
  • @dmckee 我添加了一些可能会改变一些东西的编辑。 :)

标签: bash unix parameters file-io


【解决方案1】:

一个简单的测试

#!/bin/sh

# the whole loop reads $1 line by line
while read
do
    # run $2 with the contents of the file that is in the line just read
    xargs < $REPLY $2
done < $1

工作正常。调用该文件“运行”并运行它

./run text.txt ./check

我得到以text.txt 作为参数执行的程序./check。不要忘记chmod +x run 使其可执行。

这是我使用的示例检查程序:

#!/bin/sh

echo "This is check with parameters $1 and $2"

打印给定的参数。

我的文件text.txt 是:

textfile1.txt
textfile2.txt
textfile3.txt
textfile4.txt

而文件textfile1.txt, ... 每个“check”实例都包含一行,例如:

lets go

one two

输出:

$ ./run text.txt ./check
This is check with parameters lets and go
This is check with parameters one and two
This is check with parameters uno and dos
This is check with parameters eins and zwei

【讨论】:

  • 谢谢!这是有用的东西,但快速的问题,如果 text.txt 包含其他输入的文件名以进行检查?例如, asdf1.txt 包含 let go asdf2.txt 包含一个两个
【解决方案2】:

&lt; 操作符将文件内容重定向到程序的标准输入。这与使用文件的内容作为文件的参数不同——这似乎是你想要的。为此做

./program $(cat file.txt) 

在 bash 中(或普通的旧 /bin/sh,使用

./program `cat file.txt`

)。

这不会将多行作为单独的调用进行管理,您的编辑表明这是需要的。为此,您可能会使用某种脚本语言(perl、awk、python...),这使得逐行解析文件变得容易。

【讨论】:

  • $2 &lt; cat filename &gt; filename.created 有用吗?我通过 text.txt 运行的循环获得了文件名。只需检查一下即可。
  • 不,$() 是“评估内容”运算符,是评估字符串并就地使用它的方法。你可能想要./program $(cat filename) &gt; craeted.txt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2016-07-09
相关资源
最近更新 更多