![¿Cuál es la diferencia entre gato y camiseta?](https://rvso.com/image/913172/%C2%BFCu%C3%A1l%20es%20la%20diferencia%20entre%20gato%20y%20camiseta%3F.png)
Estaba jugando con Apache php.ini
y lo conseguí, así que cuando envío correos electrónicos con un archivo PHP que tiene la mail()
función, guardará el correo electrónico en mi computadora, lo cual es bueno para pruebas y para desarrolladores web. Esta es la línea de código que agregué en php.ini
:
sendmail_path = "cat > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"
También esta línea de código funcionó también:
sendmail_path = "tee > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"
¿Cuál es la diferencia entre los comandos cat
y ?tee
Respuesta1
TL;DR:
cat
lee archivos cuyos nombres le pasas, perotee
escribe en ellos. Sólo cuando no les pasa ningún nombre de archivo, tienen el mismo efecto. De lo contrario, usarlotee
cuando quiere decircat
puede sobrescribir los archivos que deseaba leer, provocando una pérdida accidental de datos.
cat
y tee
se comportan igual cuando no les das ningún nombre de archivo. Eso es lo que está sucediendo en tu ejemplo; los comandos tienenredirecciones de salida( >
) pero no hay argumentos reales de línea de comandos. Cuando pasas los nombres de archivos de los comandos cat
y tee
, se comportan de manera diferente entre sí, e incluso puedes sobrescribir archivos accidentalmente y perder datos al pasar sus nombres a tee
cuando querías pasarlos a cat
.
El motivo cat
y tee
hacer lo mismo sin ningún argumento, pero cosas diferentes con nombres de archivos pasados como argumentos, se pueden discernir al considerar el comportamiento de cada uno. En general, tienen un comportamiento casi opuesto. cat
lee potencialmente muchos archivos y envía su salida a un lugar, mientras que tee
lee una entrada y la envía a potencialmente muchos archivos.
gato
cat
copia el contenido de todos sus archivos de entrada asalida estándar, uno después del otro. Es decir que concatena los archivos. Por ejemplo, cat x y
genera el contenido de x
seguido del contenido de y
. Cuando se le pasa un único nombre de archivo, copia el contenido de ese archivo a la salida estándar y luego, como no tiene más argumentos, se detiene.
cuando corres cat
conNonombres de archivos, por defecto lee desde su propioentrada estándar. Básicamente, eso significa que lee lo que sea que estécanalizadooredirigidoa él, o cualquier otra cosa que se escriba en una terminal. (Otra forma de decir esto es que, sin nombres de archivos, cat
se comporta como cat -
, ya que cat
,como varios otros comandos, lo trata -
especialmente y lo toma para designar la entrada estándar).
tee
tee
copia el contenido de su entrada estándar a todos sus archivos de salidaasí como su propia salida estándar. Es decir que funciona como uncruce en T--o, más precisamente,nortecruces en T dondenortees el número de archivos de salida cuyos nombres le pasa. Por ejemplo, tee x
lee su entrada, la escribe en el archivo x
y también la escribe en su propia salida estándar. tee x y
lee su entrada, la escribe en el archivo x
ytambiénal archivo y
y también lo escribe en su propia salida estándar.
El uso más común tee
es insertarlo en una canalización con un único argumento de nombre de archivo. Por ejemplo, supongamos que está canalizando la salida de un comando llamado foo
a la entrada de un comando llamado bar
. Podrías escribir foo | bar
. Pero si también desea registrar la salida en un archivo llamado logfile
para poder inspeccionarlo, puede usar foo | tee logfile | bar
.
tee
sobrescribe los archivos cuyos nombres le asignas, a menos que le pases la -a
opción, en cuyo caso los agrega. Por ejemplo, para agregarlo a ese registro en lugar de sobrescribirlo, puede usar foo | tee -a logfile | bar
.
A diferencia de cat
, el tee
comando no trata la obtención de argumentos sin nombre de archivo como un caso especial. En lugar de eso, simplemente escribe su entrada entodo cerode los archivos cuyos nombres le dio y luego lo pasa a su salida estándar como de costumbre. El efecto es que, al igual que con cat
, ejecutar tee
sin nombres de archivos también copia la entrada estándar en la salida estándar.
La cultura favorece a cat cuando solo desea copiar stdin a stdout.
Si bien puedes usar cualquiera de ellos cat
o tee
sin argumentos para este propósito, si lo usas cat
, la gente sabrá a qué te refieres. tee
sin argumentos está bien, peroaspectocomo un error. A veces esto se describe diciendo que cat
es elidiomáticomanera de hacerlo.
Tenga en cuenta también que las opciones de línea de comandos admitidas por cat
y tee
son diferentes. Probablemente se esperaría esto, ya que en su mayoría hacen cosas diferentes y, por lo tanto, son capaces de personalizar su comportamiento de una manera totalmente diferente. Verman cat
yman tee
para más detalles, especialmente sobre esto.
Respuesta2
En resumen cat
es para leer (entrada manualyarchivos) y escribir (con >
y >>
) en archivos. Y tee
sólo se trata de escribir en archivos, pero ensimultáneamentede acuerdo con la salida del comando que sirve como su entrada.
Por ejemplo:
ping 192.168.1.xx | tee [-a] ping_report.txt
Con el comando que se muestra arriba puedessimultáneamentever el resultado del ping
comandoyesa salida se escribirá en el ping_report.txt
archivo (para ser analizada más adelante, por supuesto). Si -a
se utiliza el parámetro, entonces la entrada (salida del primer comando) se agrega al ping_report.txt
archivo; de lo contrario, anula el contenido actual con la nueva entrada.