Я пытаюсь реализовать REPL (цикл чтения-eval-print) в bash. Если такая вещь уже существует, пожалуйста, проигнорируйте следующее и ответьте на этот вопрос указателем на нее.
Позвольте использовать этот script в качестве примера (name it test.sh
):
if true
then
echo a
else
echo b
fi
echo c
Что я хочу сделать, так это прочитать эту script строку за строкой, проверить, что то, что я прочитал до сих пор, является полным выражением bash; если он завершен, eval
it; в противном случае продолжайте читать следующую строку. script ниже иллюстрирует мою идею, надеюсь (это не совсем работает, хотя).
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 script, я хочу разобрать его в синтаксически полные выражения, оценить каждое выражение, захватить вывод и, наконец, пометить исходный код и выводить (скажем, используя Markdown/HTML/LaTeX/...). Например, для script
echo a
echo b
То, что я хочу достичь, - это результат следующим образом:
```bash
echo a
```
```
a
```
```bash
echo b
```
```
b
```
вместо оценки всего script и захватить весь вывод:
```bash
echo a
echo b
```
```
a
b
```