Ich hatte immer gedacht, dass Shells ganze Skripte analysieren, einen AST erstellen und diesen AST dann aus dem Speicher ausführen. Ich habe jedoch gerade einen Kommentar von Stéphane Chazelas gelesen und die Ausführung dieses Skripts getestet: edit-while-executing.sh:
#!/bin/bash
echo start
sleep 10
und dann, während es beim Laufen schlief:
$ echo "echo end" >> edit-while-executing.sh
und es hat funktioniert, damit es am Ende "Ende" druckt.
Wenn Sie jedoch versuchen, dies zu ändern:
#!/bin/bash
while true; do
echo yes
done
indem Sie tun:
$ printf "%s" "no " | dd of=edit-while-executing.sh conv=notrunc seek=35 bs=1
Es hat nicht funktioniert und immer wieder "Ja" gedruckt.
Ich habe mich auch gefragt, ob andere Nicht-Shell-Interpreter auch so funktionieren, und habe das Äquivalent des ersten Skripts mit Python ausprobiert, aber es hat nicht funktioniert. Vielleicht ist Python kein Interpreter mehr und eher ein JIT-Compiler.
Um meine Frage zu wiederholen: Ist dies ein Verhalten, das für Muscheln allgegenwärtig und auf sie beschränkt ist oder auch bei anderen Dolmetschern (die nicht als Muscheln angesehen werden) vorhanden ist? Wie funktioniert das auch so, dass ich die erste Änderung vornehmen kann, aber nicht die zweite?
. myscript
wird also zuerst myscript
als eine zusammengesetzte Anweisung analysiert und dann ausgeführt. Dies ist beispielsweise ein Grund, warum in einem solchen Skript definierte Aliase im Skript noch nicht aktiv sind.
for
Schleife) analysiert , sodass die Änderung an der Datei des Shell-Skripts keine Auswirkungen hatte.