我试图在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 echo a ``` ``` a ``` ```bash echo b ``` ``` b ```
而不是评估整个脚本并捕获所有的输出:
```bash echo a echo b ``` ``` a b ```
bash -n -c "$command_text"
…将确定您的$ command_text是否是一个语法上有效的脚本,而不实际执行它。
请注意,“语法有效”和“正确”之间的空间广泛。如果要正确解析语言,请考虑采用像http://shellcheck.net/这样的东西。