La diferencia es que usted está escribiendo a dos distinta y (de Perl y el punto de vista de su programa) identificadores de archivos independientes.
El primero es un identificador de archivo abierto en un archivo especial "dispositivo" en la Unixy OS que es "un sinónimo de la terminal de control de un proceso, en su caso " (cita de this Linux document). Tenga en cuenta que si bien comúnmente se considera "pantalla", no tiene que ser así (por ejemplo, que la terminal podría estar vinculada al archivo de dispositivo del puerto serie en su lugar); y puede no existir o no ser operable.
El segundo es un archivo manejado asociado por defecto con el descriptor de archivo # 1 para el proceso.
Pueden parecen ser idénticos a primera vista, debido al hecho de que, en una situación típica, un shell de Unix de forma predeterminada asociar su archivo descriptor # 1 (y por lo tanto uno de cada proceso se pone en marcha sin redirecciones) con /dev/tty
.
Los dos no tienen nada en común desde el punto de vista de Perl, A excepción del hecho de que esos dos comúnmente terminan asociados de forma predeterminada debido a la forma en que funcionan los shells de Unix.
El comportamiento funcional de las dos piezas de código citadas a menudo parecerá idéntico debido a este valor predeterminado, pero eso es simplemente "por accidente".
Entre diferencias prácticas:
/dev/tty
no necesariamente existe en la no-Unixy sistemas operativos. Por lo tanto, es muy poco portátil para usar tty. El equivalente de Windows es CON:
IIRC.
STDOUT
STDOUT
de un programa puede ser asociado (redirigido) a CUALQUIER COSA por quien haya llamado al programa. Podría estar asociado a un archivo, podría ser un conducto para STDIN de otro proceso.
Puede comprobar si su STDOUT está conectado a un teléfono de texto utilizando el -t
operator:
if (-t STDOUT) { say 'STDOUT is connected to a tty' }
Como otro lado, tenga en cuenta que puede asegurarse de que su STDOUT escribe a /dev/tty
cerrando explícitamente el identificador de archivo STDOUT y reabriéndolo para que apunte a /dev/tty
:
close STDOUT or die $!;
open STDOUT '>:encoding(utf8)', '/dev/tty' or die $!;
Uno de ellos escribe en/dev/tty, uno de ellos escribe en STDOUT. ¿Era eso lo que querías saber? –
@JB - no es una distinción trivial para las personas que no están muy familiarizadas con Unix – DVK
@DVK Tienes razón. Estaba confundido por la orientación Perl de la pregunta cuando la esencia era Unix. Gracias por la iluminación! –