czy istnieje sposób na sprawdzenie, czy skrypt bash jest kompletny czy nie?
Próbuję zaimplementowaćREPL (pętla do odczytu-odczytu) w bashu. Jeśli coś takiego już istnieje, zignoruj poniższe i odpowiedz na to pytanie wskaźnikiem do niego.
Użyjmy tego skryptu jako przykładu (nazwijmy totest.sh
):
if true
then
echo a
else
echo b
fi
echo c
Chcę tylko przeczytać ten skrypt wiersz po wierszu, sprawdzić, czy to, co do tej pory przeczytałem, jest kompletnym wyrażeniem bash; jeśli jest kompletny,eval
to; w przeciwnym razie czytaj dalej następną linię. Poniższy skrypt ilustruje mój pomysł z nadzieją (choć nie do końca działa).
x=""
while read -r line
do
x=$xMotywacjaW przypadku skryptu bash chcę go przetworzyć na wyrażenia kompletne składniowo, ocenić każde wyrażenie, przechwycić dane wyjściowe, a na koniec oznaczyć kod źródłowy i wynik (powiedzmy za pomocą Markdown / HTML / LaTeX / ...). Na przykład dla skryptu
echo a
echo b
To, co chcę osiągnąć, to wynik podobny do tego:
```bash
echo a
```
```
a
```
```bash
echo b
```
```
b
```
zamiast oceniać cały skrypt i przechwytywać cały wynik:
```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
MotywacjaW przypadku skryptu bash chcę go przetworzyć na wyrażenia kompletne składniowo, ocenić każde wyrażenie, przechwycić dane wyjściowe, a na koniec oznaczyć kod źródłowy i wynik (powiedzmy za pomocą Markdown / HTML / LaTeX / ...). Na przykład dla skryptu
echo a
echo b
To, co chcę osiągnąć, to wynik podobny do tego:
```bash
echo a
```
```
a
```
```bash
echo b
```
```
b
```
zamiast oceniać cały skrypt i przechwytywać cały wynik:
```bash
echo a
echo b
```
```
a
b
```