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

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
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.


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).


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.