cat видає різні помилки під час відкриття неіснуючого файлу


22

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

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory

12
Хлопці, будь ласка, не знімайте публікації лише на основі форматування, особливо це стосується повідомлень, які надходять від новачків. Тут дуже важливе питання.
Stéphane Chazelas

21
Це має бути cat < foodзамістьcat < foo
Tulains Córdova

6
@ TulainsCórdova Або в деяких культурах food < cat;)
DepressionDaniel


1
Походить лише перша помилка cat. Тепер мені цікаво, звідки береться друге повідомлення, враховуючи, що воно починається з bash:...
Дмитро Григор'єв

Відповіді:


30
cat foo

Це запускає catкоманду з аргументом foo. Помилка, надрукована на екрані, повністю залежить від того, що було вирішено програмістом команди.

cat < foo 

Це підживлює вміст файлу fooв catкоманді за допомогою STDIN Перенаправлення Bash . Якщо файл не існує, на нього скаржиться Баш.


20

У $ cat fooоболонці (тут bash) виконується catкоманда і передається параметр foo. Програма cat обирає інтерпретувати цей параметр як ім'я файлу - і намагається відкрити файл. Ви бачите помилку з програми cat, яка (природно) не може відкрити файл.

Версія $ cat < foo- це перенаправлення, яке обробляється оболонкою. <це оператор оболонки, який вказує оболонці відкривати файл і перенаправляти його на stdin. Файлу не існує, тому ви отримуєте "Немає такого файлу". Цього разу помилка походить від оболонки (bash) і виглядає дещо інакше.

Ось чому ви бачите дві різні помилки. Причина та сама - але це з двох різних програм (cat і bash).


18
Ні в cat < foo, catне викликається, якщо перенаправлення не вдалося. Це (і послідовне повідомлення про помилку) є однією з причин, чому часто краще використовувати перенаправлення, де це можливо. Також розглянемо cat < in > outvs, cat in > outде перше заважає outперекрити, якщо inйого немає (оболонка скасовує команду відразу після невдалого < inперенаправлення і не робить наступного > outперенаправлення, не кажучи вже про виклик cat).
Stéphane Chazelas

Класно! Чиста логіка. Я відредагую свої дурниці.
Клаус Андерсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.