Diferença no gato sth vs gato sth [duplicado]

4

Eu percebi que cat sth e cat < sth ambos deram a mesma saída. Eles são os mesmos?

    
por Apples 08.07.2016 / 19:53

3 respostas

6

Eles não são completamente idênticos. Nos casos em que isso importa, a abordagem de redirecionamento geralmente dará resultados mais irritantes e obscuros (claro que isso pode ser o que você quer).

$ cat < /proc/self/maps
$ cat /proc/self/maps
55c61257e000-55c61258a000 r-xp 00000000 fd:00 1180143                    /usr/bin/cat
...

Ou tente o grep, o programa de pesquisa

$ grep "grep" /proc/self/exe
Binary file /proc/self/exe matches
$ grep "grep" < /proc/self/exe
$

É um truque, mas é mais provável que você encontre isso usando sudo para executar comandos com root access:

$ sudo cat < /etc/shadow
bash: /etc/shadow: Permission denied
$ sudo cat /etc/shadow
root:!::0:99999:7:::
....
    
por 08.07.2016 / 20:27
5

O trabalho de cat é con cat enate tudo o que obtém e depois imprimi-lo no stdout, mas muitas vezes é usado para imprimir o conteúdo de um único arquivo (o que é claro é apenas concatenar o conteúdo de todos os arquivos fornecidos a ele e, em seguida, gravá-lo no stdout). stdout (saída padrão) é apenas programas geralmente escrevem dados de saída. (Existem programas (como dd ) que gravam seus dados de saída para stdout, a menos que sejam declarados diferentemente por parâmetros e também há o canal de erro padrão stderr que os programas gravam quando ocorre um erro.)

cat pode receber dados fornecidos via stdin (entrada padrão) ou dados de arquivos passados como parâmetros.

O que você está fazendo com cat sth é chamar cat com o parâmetro único sth telling cat para gravar tudo no arquivo sth para stdout. Você pode adicionar mais nomes de arquivos e ver se o conteúdo dos arquivos é concatenado e depois gravado no stdout.

cat < sth altera o stdin de cat para o conteúdo do arquivo sth antes de chamar cat . cat , em seguida, apenas lê tudo do stdin e escreve para stdout.

Em ambos os casos, cat grava o conteúdo do arquivo sth em stdout. Você pode ler mais sobre este aqui e também digitar man cat em um terminal para ler a página do manual de cat descrevendo o que faz.

Observe que o conteúdo de sth é lido pelo usuário com o qual você está logado (quem você está logado como no terminal não é necessariamente quem você está logado como na sessão gráfica (se houver)), enquanto os programas podem ser executados com direitos diferentes, escrevendo sudo antes deles e depois lendo com os direitos do usuário que os executou. Isso pode levar a resultados diferentes porque o usuário com o qual você fez login e o usuário com o qual você alternou com sudo (não necessariamente root , você pode especificar de outra forma) pode ter direitos de acesso diferentes no arquivo que está tentando ler de.

    
por 08.07.2016 / 20:11
1

No caso específico de cat , a impressão do arquivo sth funciona da mesma maneira bem usando cat sth ou cat <sth , porque o comando cat foi projetado para imprimir todos os arquivos dados como parâmetros de linha de comando (o cat sth case: cat receberá a string sth como um parâmetro e abrirá o arquivo) ou, se nenhum arquivo for fornecido, entrada padrão em vez disso (o caso cat <sth : o shell honrará o redirecionar abrindo sth e conectando-o ao padrão cat entrada).

Portanto, o comportamento sendo o mesmo em ambos os casos é específico de cat ; isto pode não funcionar em todos os comandos criados para aceitar apenas um entrada padrão ou parâmetros de linha de comando. Em outros casos, o comportamento pode ser ligeiramente diferente, pois o comando pode não ter acesso ao nome do arquivo quando os dados são obtidos através de entrada; compare:

$ grep -H foo sth
sth:foo

$ grep -H foo <sth
(standard input):foo
    
por 08.07.2016 / 20:20