Diferença entre “gato” e “gato”

68

Eu estava trabalhando em um tutorial e vi o uso de cat myfile.txt e cat < myfile.txt . Existe uma diferença entre essas duas seqüências de comandos? Parece que ambos imprimem o conteúdo de um arquivo no shell.

    
por rookie 31.01.2016 / 21:41

5 respostas

103

No primeiro caso, cat abre o arquivo, e no segundo caso, o shell abre o arquivo, passando-o como entrada padrão do cat .

Tecnicamente, eles podem ter efeitos diferentes. Por exemplo, seria possível ter uma implementação de shell que fosse mais (ou menos) privilegiada do que o programa cat . Para esse cenário, pode-se deixar de abrir o arquivo, enquanto o outro poderia.

Esse não é o cenário usual, mas mencionado para destacar que o shell e o cat não são o mesmo programa.

    
por 31.01.2016 / 21:46
20

Não há grande diferença visível no seu caso de teste. A mais óbvia seria a mensagem de erro obtida se não houver nenhum arquivo chamado myfile.txt no diretório atual ou se você não tiver permissão para lê-lo.

No primeiro caso, cat irá reclamar e no último caso, seu shell irá, mostrando claramente qual processo está tentando abrir o arquivo, cat no primeiro e o shell no último. / p>

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

Em um caso mais geral, a principal diferença do uso de redirecionamentos não pode ser usada para imprimir o conteúdo de mais de um arquivo, que é, afinal, o propósito original do cat (ou seja, cat enate) comando. Observe que o shell irá, de qualquer maneira, tentar abrir todos os arquivos passados como entrada redirecionada, mas na verdade apenas passará o último para cat , a menos que você use zsh e seu multios "zshism".

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

Em um sistema padrão, o shell e o cat não têm diferença nos direitos de acesso a arquivos, portanto, ambos falharão igualmente. Usar sudo para aumentar os privilégios de cat fará uma grande diferença no comportamento, como Thomas Dickey respondeu e anexou comentários já sugeridos.

    
por 31.01.2016 / 22:21
7

cat myfile.txt lê o arquivo myfile.txt e depois imprime na saída padrão.

cat < myfile.txt here cat não tem nenhum arquivo para abrir, então, como muitos comandos Unix leem os dados da entrada padrão, que é direcionada para lá de file.txt pelo shell, e imprime na saída padrão.

    
por 31.01.2016 / 21:49
6

A resposta do @Thomas Dickey é brilhante.

Eu só quero adicionar alguns fatos óbvios sobre o caso de ler vários arquivos (vagamente relacionados à sua pergunta, mas ainda assim):

  • cat <file1 <file2 <file3 lerá somente o arquivo3, pelo menos no bash. (Na verdade, isso depende do shell, mas a maioria dos shells dup cada arquivo especificado para stdin, o que causa a último a efetuar.)
  • cat file1 file2 file3 lerá todos os arquivos especificados sequencialmente (na verdade cat é forma abreviada da palavra concatenar ).
  • cat file1 file2 file3 <file4 <file5 <file6 lerá apenas arquivo1, arquivo2, arquivo3 (como cat ignora stdin quando argumentos de nome de arquivo são passados).
    • cat file1 file2 - file3 <file4 <file5 <file6 lerá arquivo1, arquivo2, arquivo6, arquivo3 (como o hífen força o gato a não ignorar stdin).

E sobre erros. Em caso de impossibilidade de abrir alguns arquivos especificados como argumentos (sem < ), o gato pulará arquivos com falha (com a saída de mensagem relevante para stderr), mas ainda leu outros arquivos. Em caso de impossibilidade de abrir pelo menos um dos arquivos especificados como redirecionamentos (com < ), o shell não iniciará nem mesmo o cat (isso ocorre mesmo para os redirecionamentos realmente não usados pelo cat). Em ambos os casos, o código de saída incorreto será retornado.

    
por 02.02.2016 / 08:18
0

podemos usar outro comando para notar a diferença entre:

wc –w food2.txt .

Saída possível:

6 food2.txt .

o comando informa o nome do arquivo desde que ele o saiba (passado como um argumento).

wc –w < food2.txt .

Saída possível:

6 .

a entrada padrão é redirecionada para o arquivo food2.txt sem que o comando saiba disso.

    
por 28.08.2018 / 05:53

Tags