从bash向正在运行的shell脚本发送输入

时间:2011-04-30 20:06:25

标签: bash shell expect sh

我正在为我的应用编写一个测试套件,并使用bash脚本检查测试套件输出是否与预期输出匹配。以下是该脚本的一部分:

for filename in test/*.bcs ;
do
    ./BCSC $filename > /dev/null
    NUMBER=`echo "$filename" | awk -F"[./]" '{print $2}'`
    gcc -g -m32 -mstackrealign runtime.c $filename.s -o test/e$NUMBER
    # run the file and diff against expected output
    echo "Running test file... "$filename
    test/e$NUMBER > test/e$NUMBER.out
    if [ $NUMBER = "4" ]
    then
        # it's trying to read the line
        # Pass some input to the file...
    fi
    diff test/e$NUMBER.out test/o$NUMBER.out
done

测试#4测试从stdin读取输入。我想测试脚本#4,如果是这样,则传递一组示例输入。

我刚刚意识到你可以像

那样做
test/e4 < test/e4.in > test/e4.out

其中e4.in有样本输入。是否有另一种方法可以将输入传递给正在运行的脚本?

3 个答案:

答案 0 :(得分:1)

如果要直接在脚本中提供输入数据,请使用here-document:

    test/e$NUMBER > test/e$NUMBER.out
    if [ $NUMBER = "4" ]; then
    then
        test/e$NUMBER > test/e$NUMBER.out <<END_DATA
test input goes here
you can supply as many lines of input as you want
END_DATA
    else
        test/e$NUMBER > test/e$NUMBER.out
    fi

有几种变体:如果引用分隔符(即<<'END_DATA'),则不会在here-document中替换$ variable replacement。如果您使用<<-DELIMITER,它将从每行输入中删除前导制表符(因此您可以缩进输入以匹配周围的代码)。有关详细信息,请参阅bash手册页中的“Here Documents”部分。

答案 1 :(得分:0)

您提到的方法是在发出命令/脚本时将文件重定向到stdin的传统方法。

如果您详细说明您正在寻找的“其他方式”,也许它会有所帮助,例如,为什么您甚至需要采用不同的方式呢?你有什么需要做的,这个方法不允许吗?

答案 2 :(得分:0)

你可以这样做:

cat test/e4.in | test/e4 > test/e4.out