Al evaluar if(-t STDIN)
, ¿el operador <UNIX cuenta como STDIN? Si no, ¿cómo obtengo esos datos?
Entonces alguien escribe perl example.pl < testing.txt
. Esto no se comporta como datos canalizados a través de ls | ./example.pl
. ¿Cómo puedo obtener ese comportamiento?
Respuestas
5 para la respuesta № 1Prueba -p STDIN
, que comprueba si el identificador de archivo STDIN
Está unido a una tubería.
touch foo
perl -e "print -p STDIN" < foo # nothing
cat foo | perl -e "print -p STDIN" # 1
Pero no estoy seguro de entender su pregunta. En los tres casos
1. perl -e "print $_=<STDIN>" < <(echo foo)
2. echo foo | perl -e "print $_=<STDIN>"
3. perl -e "print $_=<STDIN>" # then type "foon" to the console
las entradas son iguales y todas accesibles a través de STDIN
filehandle En los primeros dos casos, -t STDIN
evaluará a falso, y en el segundo caso, -p STDIN
será verdad
Las diferencias de comportamiento entre estos treslos casos son sutiles, y generalmente no son importantes. El tercer caso, obviamente, esperará hasta que se reciba al menos una línea de entrada (terminada con "n" o EOF). La diferencia entre los dos primeros casos es aún más sutil. Cuando la entrada a su programa se canaliza desde la salida de otro proceso, está a merced de ese primer proceso con respecto a la latencia o si ese programa amortigua su salida.
Tal vez podrías ampliar lo que quieres decir cuando dices
perl example.pl < testing.txt
no se comporta como
ls | ./example.pl
2 para la respuesta № 2
-t
prueba si o no STDIN
se adjunta a un tty.
Cuando canaliza datos a Perl, no se adjuntará a un tty. Esto no debe depender del mecanismo que use para canalizar (es decir, si canaliza un comando usando |
o canalizar un archivo usando <
.) Sin embargo, tendrá un tty adjunto cuando ejecute el programa directamente. Dado el siguiente ejemplo:
#!/usr/bin/perl
print ((-t STDIN) ? "is a ttyn" : "is not a ttyn");
Usted esperaría el siguiente resultado:
% perl ./ttytest.pl
is a tty
% perl ./ttytest.pl < somefile
is not a tty
% ls | perl ./ttytest.pl
is not a tty