如何显示从 bash 脚本发送到控制台程序的输入?

问题描述 投票:0回答:1

我的控制台程序在Ubuntu 20.04下运行。以交互方式运行时,输入表达式(例如下面的 a+b)显示在提示旁边,后面是新行上的输出,如下所示。我希望在从 bash 脚本向程序提供输入时实现相同的格式。

$ ./rec_desc1
Enter expression: a+b
F --> id
R --> eps
T --> FR
F --> id
R --> eps
T --> FR
Q --> eps
Q --> +TQ
E --> TQ
Success. 

但是,如果我通过此处字符串或管道发送来自 bash 脚本的输入(如如何从 bash 向 C 程序提供输入?中建议),则不会显示输入,不幸的是第一行输出被上移到提示旁边,如下所示。

cat rec_desc1_unit_test
#!/bin/bash
echo "Test case 1"
./rec_desc1 <<< a+b

$ ./rec_desc1_unit_test
Test case 1
Enter expression: F --> id
R --> eps
T --> FR
F --> id
R --> eps
T --> FR
Q --> eps
Q --> +TQ
E --> TQ
Success. 

有没有办法从 bash 脚本传递输入,以便它显示在提示旁边,并后跟换行符,以便它与上面的交互式案例匹配?

我最终想从 bash 脚本为不同的表达式运行大量测试用例,并希望显示输入表达式的自我文档。我可以在调用控制台程序之前调用 set -v ,以便在必要时显示输入(如下所示)。然后我需要立即调用 set +v 以避免显示描述下一个测试用例的 echo 语句。如果可能的话,我想避免用 set -v 和 set +v 包围每个测试用例。

$ cat rec_desc1_unit_test
#!/bin/bash
echo "Test case 1"
set -v
./rec_desc1 <<< a+b

$ ./rec_desc1_unit_test
Test case 1
./rec_desc1 <<< a+b
Enter expression: F --> id
R --> eps
T --> FR
F --> id
R --> eps
T --> FR
Q --> eps
Q --> +TQ
E --> TQ
Success. 
bash
1个回答
0
投票

您必须对输出进行后处理;将整个事情变成 shell 函数可能是个好主意:

run_rec_desc1() {
    printf '%s\n' "$1" |
    ./rec_desc1 |
    awk -F': ' -v input="$1" '
        NF==2 {print $1 FS input; $0 = $2}
        {print}
    '
}
$ run_rec_desc1 a+b
Enter expression: a+b
F --> id
R --> eps
T --> FR
F --> id
R --> eps
T --> FR
Q --> eps
Q --> +TQ
E --> TQ
Success.
© www.soinside.com 2019 - 2024. All rights reserved.