cat podaje inny błąd podczas otwierania nieistniejącego pliku

22

Oba poniższe polecenia próbują otworzyć nieistniejący plik foo, ale komunikaty o błędach są nieco inne. Co może być przyczyną?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
Zain Rafi
źródło
12
Chłopaki, proszę nie głosować za postami opartymi wyłącznie na formatowaniu, szczególnie w przypadku postów pochodzących od nowych użytkowników. Tutaj jest to bardzo ważne pytanie.
Stéphane Chazelas
21
Powinno być cat < foodzamiastcat < foo
Tulains Córdova
6
@ TulainsCórdova Lub, w niektórych kulturach food < cat;;)
DepressedDaniel
1
Luźno powiązane: Jakie są operatory kontroli i przekierowania powłoki?
G-Man mówi „Przywróć Monikę”
1
Tylko pierwszy błąd pochodzi cat. Teraz zastanawiam się, skąd pochodzi druga wiadomość, biorąc pod uwagę, że zaczyna się ona od bash:...
Dmitrij Grigoriew

Odpowiedzi:

30
cat foo

To uruchamia catpolecenie z argumentem foo. Błąd wydrukowany na ekranie zależy całkowicie od decyzji programisty polecenia.

cat < foo 

Spowoduje to przekazanie zawartości pliku foodo catpolecenia przy użyciu przekierowania standardowego Bash . Jeśli plik nie istnieje, narzeka na niego Bash.

dr01
źródło
20

W $ cat foopowłoce (tutaj bash) wykonuje catpolecenie i przekazuje parametr foo. Program cat wybiera interpretację tego parametru jako nazwy pliku - i próbuje otworzyć plik. Błąd, który widzisz, pochodzi z programu cat, który (oczywiście) nie może otworzyć pliku.

Wersja $ cat < foojest przekierowaniem obsługiwanym przez powłokę. <jest operatorem powłoki, który instruuje powłokę, aby otworzyła plik i przekierowała go do standardowego wejścia. Plik nie istnieje, więc pojawia się komunikat „Brak takiego pliku”. Tym razem błąd pochodzi z powłoki (bash) i wygląda trochę inaczej.

Dlatego widzisz 2 różne błędy. Przyczyna jest taka sama - ale pochodzi z 2 różnych programów (cat i bash).

Claus Andersen
źródło
18
Nie. W cat < foo, catnie zostanie wywołane, jeśli przekierowanie nie powiedzie się. To (i posiadanie spójnego komunikatu o błędzie) jest jednym z powodów, dla których często lepiej jest używać przekierowania, jeśli to możliwe. Zobacz również inne cat < in > outvs cat in > outgdzie byłe zapobiega outbyć przesłonięte jeśli innie istnieje (powłoka anuluje prawo polecenia po uszkodzonej < inprzekierowania i nie zrobić następnego > outprzekierowanie, nie mówiąc już Invoke cat).
Stéphane Chazelas
Fajne! Czysta logika. Zmienię moje bzdury.
Claus Andersen