2013-12-14 10 views
8

Esiste un modo per rilevare se l'output del mio script Node.js viene collegato a un altro dispositivo del terminale?Come rilevare se viene processato il pipe process.stdout del nodo?

vorrei qualche modo di rilevare se questo sta accadendo:

node myscript.js | less

o se questo sta accadendo:

node myscript.js

+0

Perché non gestirlo dal nodo? Passa un argomento della riga di comando per inviarlo a meno. È molto meno flessibile, ma se si vuole essere consapevoli di essere convogliato si sta perdendo comunque quella flessibilità. –

risposta

15

Il modo più semplice sarebbe process.stdout.isTTY (0.8 +) :

$ node -p -e "Boolean(process.stdout.isTTY)" 
true 
$ node -p -e "Boolean(process.stdout.isTTY)" | cat 
false 

(esempio dalla documentazione ufficiale)

In alternativa è possibile utilizzare il tty module per un controllo a grana più fine:

if (require('tty').isatty(1)) { 
    // terminal 
} 
+0

così sorpreso! funziona anche su Windows – damphat

+1

@damphat sarebbe davvero strano se non funzionasse su windows :) In realtà solo [delegati a libuv] (https://github.com/joyent/node/blob/master/src /tty_wrap.cc#L125) a 'uv_get_handle' che fa semplicemente in'/src/win/'(la logica di gestione di Windows) che in' handle.c' che [a sua volta] (https://github.com/joyent /libuv/blob/master/src/win/tty.c#L228) chiama solo [GetConsoleMode] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167 (v = vs.85) .aspx) :) –

0

è possibile verificare se stdout del processo in esecuzione viene convogliata, cercando dove il suo punti di descrittori di file, ad esempio come sotto

readlink /proc/<your process id>/fd/1 

o, più specificamente

[[ $(readlink /proc/$(pgrep -f 'node myscript.js')/fd/1) =~ ^pipe ]] && echo piped