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
command-line
io-redirection
cat
Zain Rafi
fonte
fonte
cat < food
vez decat < foo
food < cat
,;) #cat
. Agora, eu me pergunto de onde vem a segunda mensagem, considerando que ela começa combash:
...Respostas:
Isso executa o
cat
comando com argumentofoo
. O erro impresso na tela depende inteiramente do que foi decidido pelo programador do comando.Isso alimenta o conteúdo do arquivo
foo
para ocat
comando usando o redirecionamento Bash stdin . Se o arquivo não existir, é o Bash que reclama.fonte
Na
$ cat foo
concha (aqui bash) executa ocat
comando e passa o parâmetrofoo
. 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).
fonte
cat < foo
,cat
nã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 ocat < in > out
vs emcat in > out
que o anterior impedeout
que seja substituído sein
não existir (o shell cancela o comando logo após o< in
redirecionamento com falha e não faz o próximo> out
redirecionamento, muito menos invocarcat
).