Si hago esto:
x | y
¿Hay alguna forma de verificar, durante el tiempo de ejecución de x, para ver si está conectado a y? Tenga en cuenta que no sé qué es y, y no soy responsable de iniciar y.
Específicamente, estoy hablando del tiempo de ejecución de Node.js, así que tal vez esta sea una pregunta específica de Node.js. Pero en última instancia, me pregunto si es posible determinar dado cualquier tiempo de ejecución. ¿Es posible y cómo?
¿Es posible determinar si stdout/stderr están conectados a stdin de otro proceso? Supongo que de eso se trata esta pregunta.
Respuesta aceptada:
Para verificar si la salida del programa va a una tubería, según https://nodejs.org/api/fs.html#fs_class_fs_stats, debe llamar a fs.fstat(FileDescriptor)
y luego llamar a isFIFO()
en el stat
devuelto objeto (FIFO ==primero en entrar, primero en salir ==una tubería o una tubería con nombre):
$ </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
En C, harías el fstat
syscall y luego pruebe el .st_mode
campo del struct stat
devuelto usando el S_ISFIFO
macro.
Si le gusta desperdiciar ciclos de CPU y quiere usar un binario externo, puede ejecutar test -p /dev/fd/$THE_FD
para obtener la respuesta (o invocarla en un shell donde test
será un incorporado, o ejecutará stat
, o inicie otra cosa capaz de determinar el tipo de archivo).