Qual é a diferença entre gato e camiseta?

Qual é a diferença entre gato e camiseta?

Eu estava brincando com o Apache php.inie 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 cate ?tee

Responder1

DR: catlê arquivos cujos nomes você passa, mas teegrava neles. Somente quando você não passa nenhum nome de arquivo para eles eles têm o mesmo efeito. Caso contrário, usar teequando você quer dizer catpode sobrescrever os arquivos que você pretendia ler, causando perda acidental de dados.

cate teese 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 cate 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 teequando pretendia passá-los para cat.

A razão cate teefazer 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. catlê potencialmente muitos arquivos e envia sua saída para um local, enquanto teelê uma entrada e a envia para potencialmente muitos arquivos.

gato

catcopia 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 ygera o conteúdo de xseguido 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 catcomnã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, catse comporta como cat -, já que cat,como vários outros comandos, trata -especialmente e leva-o para designar a entrada padrão.)

camiseta

teecopia 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 xlê sua entrada, grava-a no arquivo xe também grava-a em sua própria saída padrão. tee x ylê sua entrada, grava-a no arquivo xetambémno arquivo ye 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 foopara 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 logfilepara poder inspecioná-la, você pode usar foo | tee logfile | bar.

teesubstitui os arquivos cujos nomes você fornece, a menos que você passe a -aopçã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 teecomando 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 teesem 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 catou teenenhum argumento para essa finalidade, se usar, catas pessoas saberão o que você quer dizer. teesem 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 cate teesã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 cateman teepara obter detalhes, especialmente sobre isso.

Responder2

Em resumo caté para leitura (entrada manualearquivos) e gravação (com >e >>) em arquivos. E teetrata-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 pingcomandoeessa saída será escrita no ping_report.txtarquivo (para ser analisada mais tarde, é claro). Se o -aparâmetro for usado, a entrada (saída do primeiro comando) será anexada ao ping_report.txtarquivo, caso contrário, substituirá o conteúdo atual pela nova entrada.

informação relacionada