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:
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?
Nein. Bash hat kein Konzept des "Suchens" mit seiner Umleitung. Es liest / schreibt (meistens) von Anfang bis Ende in einem langen Stream.
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% 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 Ссылка :
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.
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.)
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.
Um den Dateideskriptor zurückzuspulen, können Sie einfach /proc/self/fd/3
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.
Tags und Links file-io linux bash unix read-write