кошка выдает другую ошибку при открытии несуществующего файла

22

Обе следующие команды пытаются открыть несуществующий файл foo, но сообщения об ошибках немного отличаются. Что может быть причиной?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
Заин Рафи
источник
12
Ребята, пожалуйста, не понижайте сообщения только на основе форматирования, особенно для сообщений, поступающих от новичков. Здесь это очень актуальный вопрос.
Стефан Шазелас
21
Стоит cat < foodвместоcat < foo
Тулаинс Кордова
6
@ TulainsCórdova Или, в некоторых культурах food < cat;)
ДепрессияДаниэль
1
Слабое отношение: каковы операторы управления и перенаправления оболочки?
G-Man говорит «Восстановить Монику»
1
Только первая ошибка исходит от cat. Теперь мне интересно, откуда пришло второе сообщение, учитывая, что оно начинается с bash:...
Дмитрий Григорьев

Ответы:

30
cat foo

Это запускает catкоманду с аргументом foo. Ошибка, отображаемая на экране, полностью зависит от того, что было решено программистом команды.

cat < foo 

Это передает содержимое файла fooв catкоманду с помощью перенаправления стандартного ввода Bash . Если файл не существует, это Bash, который жалуется на это.

dr01
источник
20

В $ cat fooоболочке (здесь bash) выполняет catкоманду и передает параметр foo. Программа cat решает интерпретировать этот параметр как имя файла и пытается открыть файл. Вы видите ошибку из программы cat, которая (естественно) не может открыть файл.

Версия $ cat < foo- это перенаправление, которое обрабатывается оболочкой. <является оператором оболочки, который инструктирует оболочку открывать файл и перенаправлять его в stdin Файл не существует, поэтому вы получаете «Нет такого файла». На этот раз ошибка исходит из оболочки (bash) и выглядит немного иначе.

Вот почему вы видите 2 разных ошибки. Причина та же самая - но это из 2 разных программ (cat и bash).

Клаус Андерсен
источник
18
Нет, in cat < foo, catне вызывается, если перенаправление не удается. Это (и наличие постоянного сообщения об ошибке) является одной из причин, почему часто лучше использовать перенаправление, где это возможно. Также cat < in > outобратите внимание на то, cat in > outгде первое предотвращает outпереопределение, если inоно не существует (оболочка отменяет команду сразу после неудачного < inперенаправления и не выполняет следующего > outперенаправления, не говоря уже о вызове cat).
Стефан Шазелас
Круто! Чистая логика. Я отредактирую свою глупость.
Клаус Андерсен