![Qual é a diferença entre gato e camiseta?](https://rvso.com/image/913172/Qual%20%C3%A9%20a%20diferen%C3%A7a%20entre%20gato%20e%20camiseta%3F.png)
Eu estava brincando com o Apache php.ini
e descobri que quando envio e-mails com um arquivo PHP que tem a mail()
função de salvar o e-mail no meu computador, o que é bom para testes e para desenvolvedores web. Esta é a linha de código que adicionei no php.ini
:
sendmail_path = "cat > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"
Além disso, esta linha de código também funcionou:
sendmail_path = "tee > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"
Qual é a diferença entre os comandos cat
e ?tee
Responder1
DR:
cat
lê arquivos cujos nomes você passa, mastee
grava neles. Somente quando você não passa nenhum nome de arquivo para eles eles têm o mesmo efeito. Caso contrário, usartee
quando você quer dizercat
pode sobrescrever os arquivos que você pretendia ler, causando perda acidental de dados.
cat
e tee
se comportar da mesma forma quando você não fornecer nenhum nome de arquivo. Isso é o que está acontecendo no seu exemplo; os comandos têmredirecionamentos de saída( >
) mas nenhum argumento de linha de comando real. Quando você passa os nomes de arquivos dos comandos cat
e tee
, eles se comportam de maneira diferente um do outro, e você pode até mesmo sobrescrever arquivos acidentalmente e perder dados passando seus nomes para tee
quando pretendia passá-los para cat
.
A razão cat
e tee
fazer a mesma coisa sem quaisquer argumentos, mas coisas diferentes com nomes de arquivos passados como argumentos, podem ser discernidas considerando o comportamento de cada um. Em geral, eles têm um comportamento quase oposto. cat
lê potencialmente muitos arquivos e envia sua saída para um local, enquanto tee
lê uma entrada e a envia para potencialmente muitos arquivos.
gato
cat
copia o conteúdo de todos os seus arquivos de entrada parasaída padrão, um após o outro. Isso quer dizer que ele concatena os arquivos. Por exemplo, cat x y
gera o conteúdo de x
seguido pelo conteúdo de y
. Quando passa um único nome de arquivo, ele copia o conteúdo desse arquivo para a saída padrão e então, como não possui mais argumentos, para.
Quando você corre cat
comnãonomes de arquivos, o padrão é ler por conta própriaentrada padrão. Basicamente, isso significa que ele lê o que quer que estejacanalizadoouredirecionadopara ele, ou de outra forma o que quer que seja digitado em um terminal. (Outra maneira de colocar isso é que, sem nomes de arquivos, cat
se comporta como cat -
, já que cat
,como vários outros comandos, trata -
especialmente e leva-o para designar a entrada padrão.)
camiseta
tee
copia o conteúdo de sua entrada padrão para todos os seus arquivos de saídabem como sua própria saída padrão. Isto quer dizer que funciona como umJunção em T--ou, mais precisamente,NJunções em T ondeNé o número de arquivos de saída cujos nomes você passa para ele. Por exemplo, tee x
lê sua entrada, grava-a no arquivo x
e também grava-a em sua própria saída padrão. tee x y
lê sua entrada, grava-a no arquivo x
etambémno arquivo y
e também o grava em sua própria saída padrão.
O uso mais comum tee
é inseri-lo em um pipeline com um único argumento de nome de arquivo. Por exemplo, suponha que você esteja canalizando a saída de um comando chamado foo
para a entrada de um comando chamado bar
. Você poderia escrever foo | bar
. Mas se você também quiser registrar a saída em um arquivo chamado logfile
para poder inspecioná-la, você pode usar foo | tee logfile | bar
.
tee
substitui os arquivos cujos nomes você fornece, a menos que você passe a -a
opção e, nesse caso, ele anexa a eles. Por exemplo, para anexar a esse log em vez de substituí-lo, você poderia usar foo | tee -a logfile | bar
.
Ao contrário cat
, o tee
comando não trata a ausência de argumentos de nome de arquivo como um caso especial. Em vez disso, simplesmente escreve sua entrada emtudo zerodos arquivos cujos nomes você forneceu e, em seguida, passa-os para sua saída padrão, como de costume. O efeito é que, como acontece com cat
, a execução tee
sem nomes de arquivos também copia a entrada padrão para a saída padrão.
A cultura favorece cat quando você deseja apenas copiar stdin para stdout.
Embora você possa usar argumentos cat
ou tee
nenhum argumento para essa finalidade, se usar, cat
as pessoas saberão o que você quer dizer. tee
sem argumentos está bem, masvisualcomo um erro. Às vezes isso é descrito dizendo que cat
é oidiomáticomaneira de fazer isso.
Observe também que as opções de linha de comando suportadas por cat
e tee
são diferentes. Você provavelmente esperaria isso, já que eles geralmente fazem coisas diferentes e, portanto, são capazes de personalizar seu comportamento de maneira totalmente diferente. Verman cat
eman tee
para obter detalhes, especialmente sobre isso.
Responder2
Em resumo cat
é para leitura (entrada manualearquivos) e gravação (com >
e >>
) em arquivos. E tee
trata-se apenas de gravar em arquivos - mas emsimultaneamentede acordo com a saída do comando que está servindo como sua entrada.
Por exemplo:
ping 192.168.1.xx | tee [-a] ping_report.txt
Com o comando mostrado acima você podesimultaneamenteveja a saída do ping
comandoeessa saída será escrita no ping_report.txt
arquivo (para ser analisada mais tarde, é claro). Se o -a
parâmetro for usado, a entrada (saída do primeiro comando) será anexada ao ping_report.txt
arquivo, caso contrário, substituirá o conteúdo atual pela nova entrada.