
Ich schreibe eine C++-Anwendung und muss mit Prozesssubstitution in der Bash-Shell arbeiten.
Ich versuche, eine Möglichkeit zu finden, die als Argumente an mein Programm übergebenen Pfade zu validieren. Einige davon verweisen auf FIFO-Dateien, die durch Prozesssubstitution erstellt wurden.
Gibt es eine Shell- (oder C++-)Methode, mit der ich überprüfen kann, ob diese Dateien vom System erstellt werden /dev/fd
oder ob sie woanders erstellt werden?
Antwort1
Die kurze Antwort lautet, dass Sie das nicht tun können. Nur weil ein Verzeichnis der Ort ist, an dem Bash standardmäßig FIFO-Pfade ablegt, bedeutet das nicht, dass ein bestimmtes FIFO in diesem Verzeichnis von Bash erstellt wurde oder dass es von Bash als Argument an Ihren Befehl übergeben wurde.
Betrachten Sie das Gesamtbild Ihres Problems. Was versuchen Sie WIRKLICH zu lösen?
Wenn Sie versuchen, das Problem „Die Ausgabe meines Programms muss immer in ein anderes Programm weitergeleitet werden“ zu lösen, verlangen Sie vom Benutzer nicht, die obskure Prozesssubstitution von Bash zu verwenden. Was ist, wenn die Standard-Shell auf ihrem System zsh ist? Bourne-Shell? Korn-Shell?
Lassen Sie Ihr Programm stattdessen eine Pipe erstellen, sich verzweigen und das andere Programm ausführen.
Was also versuchen Sie wirklich zu tun? Was passiert, wenn Sie, Gott bewahre, Ihre Ausgabe in eine Datei schreiben, die der Benutzer Ihres Programms übergeben hat, anstatt in ein von Bash erstelltes FIFO?
Antwort2
Verwenden Sie die -p
Option, um anzugeben test
, ob es sich bei einer Datei um eine Pipe handelt:
#!/bin/bash
file="$1"
if [ -p "$file" ]
then
echo "$file is a pipe"
fi
Demo:
$ myscript.sh <(echo hello)
/dev/fd/63 is a pipe