Bash liest / schreibt Dateideskriptoren - sucht den Start der Datei

7

Ich habe versucht, den Lese- / Schreib-Dateideskriptor in bash zu verwenden, so dass ich die Datei löschen konnte, auf die der Dateideskriptor später Bezug nahm:

%Vor%

, aber der Befehl cat gibt keine Ausgabe aus. Ich kann erreichen, was ich will, wenn ich separate Dateideskriptoren zum Lesen und Schreiben verwende:

%Vor%

welches Hello world ausgibt.

Ich vermutete, dass bash nicht automatisch den Anfang des Dateideskriptors sucht, wenn Sie vom Schreiben zum Lesen wechseln, und die folgende Kombination von bash und python bestätigt dies:

fdrw.sh

%Vor%

fdrw.py

%Vor%

was ergibt:

%Vor%

Gibt es eine Möglichkeit zu erreichen, was ich will nur mit Bash?

    
telotortium 01.10.2010, 10:23
quelle

7 Antworten

2

Nein. Bash hat kein Konzept des "Suchens" mit seiner Umleitung. Es liest / schreibt (meistens) von Anfang bis Ende in einem langen Stream.

    
Ignacio Vazquez-Abrams 01.10.2010, 10:45
quelle
7

Wenn Sie jemals nach bash-Dateideskriptoren suchen möchten, können Sie einen Unterprozess verwenden, da er die Dateideskriptoren des übergeordneten Prozesses erbt. Hier ist ein Beispiel C-Programm, um dies zu tun.

seekfd.c

%Vor%     
telotortium 03.10.2010 03:08
quelle
5

Ich habe einen Weg gefunden, es in bash zu machen, aber es beruht auf einer obskuren Funktion von exec < /dev/stdin , die den Dateideskriptor von stdin tatsächlich nach Ссылка :

%Vor%

Der Schreibdeskriptor wird davon nicht beeinflusst, sodass Sie die Ausgabe noch an den Deskriptor 3 vor dem cat anhängen können.

Leider funktioniert das nur unter Linux, nicht unter MacOS (BSD), auch nicht mit der neuesten Bash-Version. Es scheint also nicht sehr portabel.

    
David Ongaro 18.05.2014 21:26
quelle
3

Versuchen Sie, die Reihenfolge der Befehle zu ändern:

%Vor%     
yabt 01.10.2010 12:08
quelle
3

Wenn Sie einen Dateideskriptor in bash öffnen, wird dieser als Datei in /dev/fd/ zugänglich. Auf dem können Sie cat tun und es wird von Anfang an oder anhängen ( echo "something" >> /dev/fd/3 ), und es wird es bis zum Ende hinzufügen. Zumindest auf meinem System verhält es sich so. (Auf der anderen Seite kann ich anscheinend nicht in der Lage sein, "cat & lt; & amp; 3" zur Arbeit zu bringen, selbst wenn ich dem Deskriptor nichts schreibe.)

    
PSkocik 06.03.2015 12:52
quelle
0
%Vor%

Wie in anderen Antworten vorgeschlagen , wird cat den Dateideskriptor für Sie zurückspulen, bevor Sie von ihm lesen, da er denkt es ist nur eine normale Datei.

    
sanmai 26.01.2017 00:42
quelle
0

Um den Dateideskriptor zurückzuspulen, können Sie einfach /proc/self/fd/3

verwenden

Testskript:

%Vor%

Versuchen Sie, das Skript während der Ausführung zu beenden. Sie werden sehen, dass die Datei im Gegensatz zu dem, was mit der Trap-Methode geschieht, tatsächlich gelöscht wird.

    
Hexdump 03.11.2017 09:09
quelle

Tags und Links