Se faccio questo:
x | y
c'è un modo per controllare, durante il runtime di x, se è connesso a y? Nota che non so cosa sia y e non sono responsabile dell'avvio di y.
In particolare, sto parlando del runtime di Node.js, quindi forse questa è una domanda specifica di Node.js. Ma alla fine, mi chiedo se è possibile determinare dato il tempo di esecuzione. È possibile e come?
È possibile determinare se stdout/stderr sono collegati allo stdin di un altro processo? Immagino sia di questo che si tratta questa domanda.
Risposta accettata:
Per verificare se l'output del programma sta andando su una pipe, in base a https://nodejs.org/api/fs.html#fs_class_fs_stats, devi chiamare fs.fstat(FileDescriptor)
e quindi chiama isFIFO()
sul stat
restituito oggetto (FIFO ==first-in-first-out ==una pipe o una named pipe):
$ </dev/null node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
false
$ : | node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
true
In C, creeresti il fstat
syscall e quindi testare .st_mode
campo della struct stat
restituita utilizzando il S_ISFIFO
macro.
Se ti piace sprecare cicli della CPU e vuoi usare un binario esterno, puoi eseguire test -p /dev/fd/$THE_FD
per ottenere la risposta (o invocarla in una shell dove test
sarà un built-in o eseguirà stat
o avviare qualcos'altro in grado di determinare il tipo di file).