我正在尝试在bash中实现一个REPL (read-eval-print loop)。如果这样的东西已经存在,请忽略以下内容,并使用指向它的指针回答此问题。
让我们以此脚本为例(将其命名为test.sh
):
if true
then
echo a
else
echo b
fi
echo c
我想要做的是逐行阅读这个脚本,检查到目前为止我读到的是不是一个完整的bash表达式;如果是完整的,就eval
它;否则继续阅读下一行。下面的脚本很有希望地说明了我的想法(尽管它并不是很有效)。
x=""
while read -r line
do
x=$x$'\n'$line # concatenate by \n
# the line below is certainly a bad way to go
if eval $x 2>/dev/null; then
eval $x # code seems to be working, so eval it
x="" # empty x, and start collecting code again
else
echo 'incomplete expression'
fi
done < test.sh
动机
对于bash脚本,我希望将其解析为语法完整的表达式,计算每个表达式,捕获输出,最后标记源代码和输出(比如使用Markdown/HTML/LaTeX/...)。例如,对于脚本
echo a
echo b
我想要实现的是如下输出:
```bash
回显为
一个
```bash
回声b
B
而不是评估整个脚本并捕获所有输出:
```bash
回显为
回声b
一个
B
https://stackoverflow.com/questions/17820740
复制相似问题