2016-07-09 1 views
0

Ich bin mir nicht sicher, dass das möglich ist, aber ich habe oft gedacht, dass und einige Lösungen mich erstaunt haben. Ist es möglich, das Äquivalent des folgenden Skript zu erstellen, ohne dass zwei Prozesse zu schaffen (in diesem Fall ist es klar, zwei Prozesse geschaffen werden, weil es ein Rohr):Verwenden Sie inotifywait -m im Skript, ohne einen zusätzlichen Prozess zu erstellen?

#!/bin/bash 

EVENTS="CREATE,CLOSE_WRITE,DELETE,MODIFY,MOVED_FROM,MOVED_TO" 
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | \ 
    while true; do 
    read TMP 
    echo "${TMP}" >> ~/Desktop/eventlog 
    done 

Beachten Sie, dass ich innerhalb der while-Schleife will Zugang zu der Veranstaltung haben.

Es scheint mir, dass eine Pipe notwendig ist, weil wir mit einem Prozess schreiben und von einem anderen lesen müssen. Aber vielleicht gibt es einen Trick?

Antwort

2

In bash 4.2 zu tun, können Sie Legen Sie die Option lastpipe fest, damit die Schleife while in der aktuellen Shell statt in einem separaten Prozess ausgeführt werden kann.

shopt -s lastpipe 
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | 
    while true; do 
    read TMP 
    echo "${TMP}" >> ~/Desktop/eventlog 
    done 

(Sie keine explizite Zeilenfortsetzung nach den | müssen, da bash weiß, dass eine Linie nicht mit diesem Zeichen enden kann.)

+0

ah ja das macht, was ich versucht habe zu erreichen. Interessant, ich frage mich, wie es möglich ist, das zu implementieren. Ich denke, sie erstellen keinen neuen Prozess, sondern einen neuen Thread? Es scheint, wenn man schreibt und man liest, muss es zwei "Somethings" geben. Ich schätze zwei Threads. –

+0

Nein, es wird nur der erste Befehl in einem neuen Prozess und die Schleife im aktuellen Prozess ausgeführt, anstatt zwei neue Prozesse zu verzweigen und zu warten. – chepner

1

Ist es richtig anzunehmen, dass Sie versuchen, ein sekundäres Skript zu vermeiden, so dass in der for-Schleife geänderte Variablen ihren Wert nicht verlieren, sobald die Schleife fertig ist?

In diesem Fall können Sie nur austauschen können und so etwas wie

while read TMP; do 
    echo "${TMP}" >> ~/Desktop/eventlog 
done < <(inotifywait -e "$EVENTS" -m -r ~/Desktop/testing) 

aber, wenn Sie über die Flexibilität des Codes Flusses betroffen sind Sie zu einer Datei-Handelte umleiten können und dann von diesem Griff lesen, wenn Kommentar unten, wenn Sie mich wollen

en Beispiel fischen, wenn es etwas anderes - fügen Sie bitte Detail, was Sie suchen tatsächlich

+0

Vielen Dank für diese Antwort. Ich werde es studieren. Ich bedauere die mangelnde Klarheit meiner Anfrage. Ich wollte nicht, dass zwei Prozesse aus der Schleife ausgeführt werden. Chepner hat die Antwort, die ich hoffte, war möglich. Mit freundlichen Grüßen. –

Verwandte Themen