Есть ли способ проверить, завершен ли bash-скрипт или нет?

Я пытаюсь реализоватьREPL (цикл чтения-оценки-печати) в баш. Если такая вещь уже существует, пожалуйста, проигнорируйте следующее и ответьте на этот вопрос с указателем на это.

Давайте использовать этот скрипт в качестве примера (назовите егоtest.sh):

if true
then
  echo a
else
  echo b
fi
echo c

То, что я хочу сделать, это прочитать этот скрипт построчно, проверить, является ли то, что я прочитал до сих пор, полным выражением bash; если это завершено,eval Это; в противном случае продолжайте читать следующую строку. Сценарий ниже иллюстрирует мою идею с надеждой (хотя она не совсем работает).

x=""
while read -r line
do
  x=$xмотивация

Для скрипта bash я хочу разобрать его в синтаксически законченные выражения, оценить каждое выражение, записать вывод и, наконец, разметить исходный код и вывод (скажем, используя Markdown / HTML / LaTeX / ...). Например, для скрипта

echo a
echo b

Чего я хочу добиться, так это получить следующий результат:

```bash
echo a
```

```
a
```

```bash
echo b
```

```
b
```

вместо оценки всего сценария и захвата всех выходных данных:

```bash
echo a
echo b
```

```
a
b
```
\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
```

Ответы на вопрос(4)

Ваш ответ на вопрос