Yih*_*Xie 20 bash shell read-eval-print-loop
我正在尝试在bash中实现REPL(read-eval-print循环).如果这样的事情已经存在,请忽略以下内容并用指针回答这个问题.
我们以此脚本为例(命名test.sh):
if true
then
echo a
else
echo b
fi
echo c
Run Code Online (Sandbox Code Playgroud)
我想要做的是逐行阅读这个脚本,检查我到目前为止读的是否是一个完整的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
Run Code Online (Sandbox Code Playgroud)
对于bash脚本,我想将其解析为语法上完整的表达式,计算每个表达式,捕获输出,最后标记源代码和输出(例如,使用Markdown/HTML/LaTeX/...).例如,对于脚本
echo a
echo b
Run Code Online (Sandbox Code Playgroud)
我想要实现的是这样的输出:
```bash
echo a
```
```
a
```
```bash
echo b
```
```
b
```
Run Code Online (Sandbox Code Playgroud)
而不是评估整个脚本并捕获所有输出:
```bash
echo a
echo b
```
```
a
b
```
Run Code Online (Sandbox Code Playgroud)
bash -n -c "$command_text"
Run Code Online (Sandbox Code Playgroud)
...将确定您是否$command_text是一个语法上有效的脚本而不实际执行它.
请注意,"语法上有效"和"正确"之间存在巨大的空间.如果要正确解析语言,请考虑采用类似http://shellcheck.net/的内容.