使用.sh脚本测试C程序时显示输入

时间:2014-10-20 02:40:55

标签: c linux bash shell

我有一个交互式C程序,我想使用.sh脚本进行测试。 我根据这些方向创建了一个:https://unix.stackexchange.com/questions/21759/how-to-send-input-to-a-c-program-using-a-shell-script,它工作正常,但屏幕上的输出不好。 我希望输入显示在屏幕上并在输入后显示新行,就像用户手动输入所有内容一样。它现在显示的方式是提示,然后是空格,然后是下一个提示,依此类推。

我看过许多不同的问题,但没有人提供答案。 我可以每次从程序本身打印输入,但这意味着即使用户手动输入数据也会打印输入。

我确实理解它是因为输入来自文件而不是命令行,但我仍然想要解决这个问题。 无论如何我能做到吗?我不能使用任何外部工具,因为我必须为一个类提交此脚本。

1 个答案:

答案 0 :(得分:1)

如果您可以使用bash,并且 - 例如 - 您的程序为每个行输入输出一行,那么您需要从shell脚本执行的操作是:

  1. 存储您的输入。
  2. 将其传递给您的程序并存储输出。
  3. 交替回显每个输入和输出行。
  4. 这是一个示例C程序,它只是回显任何键入的行,前缀为“你输入”:

    #include <stdio.h>
    
    int main(void){
        char buffer[1024];
    
        while ( fgets(buffer, 1024, stdin) ) {
            printf("You entered: %s", buffer);
        }
    
        return 0;
    }
    

    如果我们从终端运行,我们得到这个:

    paul@thoth:~/src/sandbox$ ./sample
    first line
    You entered: first line
    second line
    You entered: second line
    third line
    You entered: third line
    paul@thoth:~/src/sandbox$ 
    

    (使用 CTRL-D 在输入第三行后终止输入。)

    这是一个模拟它的bash脚本:

    #!/bin/bash
    
    # Pass input to program and store output
    
    input=$'first line\nsecond line\nthird line'
    output=`echo "$input" | ./sample`
    
    # Split input and output lines to arrays
    
    IFS=$'\n'
    inlines=($input)
    outlines=($output)
    
    # Alternately print input and outline lines
    
    for i in "${!inlines[@]}"; do
        echo "${inlines[$i]}"
        echo "${outlines[$i]}"
    done
    

    给出输出:

    paul@thoth:~/src/sandbox$ ./test_sample.sh
    first line
    You entered: first line
    second line
    You entered: second line
    third line
    You entered: third line
    paul@thoth:~/src/sandbox$ 
    

    与在交互式会话中的外观相同。

    如果您的程序没有使用像这样的简单的逐行调用和响应,那么您将需要做更多的工作,但如果您拥有所有的输入和输出行,并且您知道期待什么,然后它是可行的,因为在程序完成后你仍然可以访问你的所有输入和所有输出,你可以回应它们,但是你需要。