我正在尝试编写一个shell测试程序,将该程序的输出与示例程序进行比较。我已经在文本文件中存储了命令列表,它看起来像这样: 命令。txt:
echo line A > a
echo line A > b
./program a b
和外壳测试如下:
cat $testname | while read LINE
do
echo -e "$LINE$"
$LINE
done
但程序不会创建文件a和b,而是产生以下内容:
echo line A > a
line A > a
echo line B > b
line B > b
我如何执行命令,就像将其写在shell文件中一样,然后将输出重定向到另一个文件?
答案 0 :(得分:2)
我认为唯一的方法是使用eval
:
cat "$testname" | while read -r; do
echo "$REPLY"
eval "$REPLY"
done
如果仅运行$LINE
,它将执行分词,但不会执行I / O重定向,因此它将>
作为常规参数传递给echo
。
答案 1 :(得分:1)
shell在单词扩展之前处理重定向,这意味着在这种情况下shell不会解释字符串中的>
。您需要明确要求将字符串解释为完整命令,如下所示:
eval "$LINE"
答案 2 :(得分:1)
如果您想将commands.txt文件中完全相同的行写到另一个文件中,可以说;
echo "$line" >> WriteTheLines.txt
如果您想执行commands.txt文件内部的命令,并将命令的输出写入另一个文件,您可以说;
eval "$line" >> ExecuteTheCommands.txt
举个例子;
#!/bin/bash
input="/home/commands.txt"
while read line
do
echo "$line" >> WriteTheCommands.txt
eval "$line" >> ExecuteTheCommands.txt
done<"$input"