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.