bash, for-loops und job control

02/03/2008 - 20:23 von Adalbert Michelic | Report spam
Hallo,

nachdems hier grad wieder mal so ruhig ist, eine der Sachen, die
mich schon lànger mal interessieren würden:

Mit Ctrl-Z kann ich einen laufenden Befehl ja unterbrechen, und ihn
spàter entweder mit bg in den Hintergrund schicken, oder ihn mit fg
im Vordergrund weiter laufen lassen.

Funktioniert normalerweise auch toll. Aber warum geht das grad mit
for-Schleifen in einer bash nicht?

,-
| am@ixion:~$ for i in `seq 1 10` ; do echo $i && sleep 1; done
| 1
| 2
| 3
|
| [1]+ Stopped sleep 1
| am@ixion:~$ fg
| sleep 1
`-

Das aktuell laufende Programm làuft noch bis zum Ende, dann gehts
kommentarlos nicht mehr weiter. Stell ich mich blöd an, darf man das
einfach nicht, gibts da logische Erklàrungen, ...?


Adalbert, ders gern zumindest verstehen würde
 

Lesen sie die antworten

#1 Peter J. Holzer
02/03/2008 - 21:09 | Warnen spam
On 2008-03-02 19:23, Adalbert Michelic wrote:
Mit Ctrl-Z kann ich einen laufenden Befehl ja unterbrechen, und ihn
spàter entweder mit bg in den Hintergrund schicken, oder ihn mit fg
im Vordergrund weiter laufen lassen.

Funktioniert normalerweise auch toll. Aber warum geht das grad mit
for-Schleifen in einer bash nicht?

,-
| :~$ for i in `seq 1 10` ; do echo $i && sleep 1; done
| 1
| 2
| 3
|
| [1]+ Stopped sleep 1
| :~$ fg
| sleep 1
`-

Das aktuell laufende Programm làuft noch bis zum Ende, dann gehts
kommentarlos nicht mehr weiter. Stell ich mich blöd an, darf man das
einfach nicht, gibts da logische Erklàrungen, ...?



Eine for-Schleife wird in der Shell abgearbeitet (nicht in einem
Kindprozess), daher ist der einzige Job, der bei ^Z angehalten werden
kann, das gerade ausgeführte Kommando (in dem Fall also "sleep 1"). Aber
was soll die Shell dann machen? Die Schleife fortsetzen wàre nicht sehr
sinnvoll (dann làuft das nàchste sleep 1), denn der Benutzer hat ja
wahrscheinlich ^Z gedrückt, damit er einen Prompt bekommt. Also wird die
Schleife abgebrochen.

Eine Lösung gàbe es natürlich schon: Die Shell müsste forken, der
Kindprozess würde die Schleife weiter abarbeiten und der Parent den
nàchsten Prompt anzeigen. Aber einerseits ist das irgendwie unlogisch,
dass ^Z einen neuen Job erzeugt, statt einen vorhandenen zu stoppen,
zweitens war das noch nie so (da könnt ja jeder kommen) und drittens
traut sich den ganzen Job-Control-Code wahrscheinlich kein Mensch mehr
angreifen ;-)

hp

Ähnliche fragen