cat dá erro diferente ao abrir arquivo inexistente

22

Os dois comandos a seguir tentam abrir um arquivo inexistente foo, mas as mensagens de erro são um pouco diferentes. Qual seria a razão?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
Zain Rafi
fonte
12
Pessoal, por favor, não diminuam o voto das postagens apenas com base na formatação, especialmente nas postagens vindas de recém-chegados. Aqui, é uma pergunta muito válida.
Stéphane Chazelas
21
Deve ser em cat < foodvez decat < foo
Tulains Córdova
6
@ TulainsCórdova Ou, em algumas culturas food < cat,;) #
DepressedDaniel
1
Relacionado livremente: Quais são os operadores de controle e redirecionamento do shell?
G-Man Diz 'Reinstate Monica'
1
Somente o primeiro erro vem cat. Agora, eu me pergunto de onde vem a segunda mensagem, considerando que ela começa com bash:...
Dmitry Grigoryev

Respostas:

30
cat foo

Isso executa o catcomando com argumento foo. O erro impresso na tela depende inteiramente do que foi decidido pelo programador do comando.

cat < foo 

Isso alimenta o conteúdo do arquivo foopara o catcomando usando o redirecionamento Bash stdin . Se o arquivo não existir, é o Bash que reclama.

dr01
fonte
20

Na $ cat fooconcha (aqui bash) executa o catcomando e passa o parâmetro foo. O programa cat escolhe interpretar esse parâmetro como um nome de arquivo - e tenta abrir o arquivo. O erro que você vê é do programa cat que (naturalmente) não pode abrir o arquivo.

A versão $ cat < fooé um redirecionamento que é tratado pelo shell. <é um operador shell que instrui o shell a abrir um arquivo e redirecioná-lo para o stdin. O arquivo não existe, então você recebe um "Não existe esse arquivo". Desta vez, o erro vem do shell (bash) e parece um pouco diferente.

É por isso que você vê 2 erros diferentes. A causa é a mesma - mas é de 2 programas diferentes (cat e bash).

Claus Andersen
fonte
18
No. in cat < foo, catnão será chamado se o redirecionamento falhar. Essa (e com mensagem de erro consistente) é um dos motivos pelos quais geralmente é melhor usar o redirecionamento sempre que possível. Considere também o cat < in > outvs em cat in > outque o anterior impede outque seja substituído se innão existir (o shell cancela o comando logo após o < inredirecionamento com falha e não faz o próximo > outredirecionamento, muito menos invocar cat).
Stéphane Chazelas
Legal! Pura lógica. Vou editar meu absurdo.
Claus Andersen