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


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
Только первая ошибка исходит от cat. Теперь мне интересно, откуда пришло второе сообщение, учитывая, что оно начинается с bash:...
Дмитрий Григорьев

Ответы:


30
cat foo

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

cat < foo 

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


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).
Стефан Шазелас

Круто! Чистая логика. Я отредактирую свою глупость.
Клаус Андерсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.