Обе следующие команды пытаются открыть несуществующий файл foo
, но сообщения об ошибках немного отличаются. Что может быть причиной?
$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
command-line
io-redirection
cat
Заин Рафи
источник
источник
cat < food
вместоcat < foo
food < cat
;)cat
. Теперь мне интересно, откуда пришло второе сообщение, учитывая, что оно начинается сbash:
...Ответы:
Это запускает
cat
команду с аргументомfoo
. Ошибка, отображаемая на экране, полностью зависит от того, что было решено программистом команды.Это передает содержимое файла
foo
вcat
команду с помощью перенаправления стандартного ввода Bash . Если файл не существует, это Bash, который жалуется на это.источник
В
$ cat foo
оболочке (здесь bash) выполняетcat
команду и передает параметрfoo
. Программа cat решает интерпретировать этот параметр как имя файла и пытается открыть файл. Вы видите ошибку из программы cat, которая (естественно) не может открыть файл.Версия
$ cat < foo
- это перенаправление, которое обрабатывается оболочкой.<
является оператором оболочки, который инструктирует оболочку открывать файл и перенаправлять его в stdin Файл не существует, поэтому вы получаете «Нет такого файла». На этот раз ошибка исходит из оболочки (bash) и выглядит немного иначе.Вот почему вы видите 2 разных ошибки. Причина та же самая - но это из 2 разных программ (cat и bash).
источник
cat < foo
,cat
не вызывается, если перенаправление не удается. Это (и наличие постоянного сообщения об ошибке) является одной из причин, почему часто лучше использовать перенаправление, где это возможно. Такжеcat < in > out
обратите внимание на то,cat in > out
где первое предотвращаетout
переопределение, еслиin
оно не существует (оболочка отменяет команду сразу после неудачного< in
перенаправления и не выполняет следующего> out
перенаправления, не говоря уже о вызовеcat
).