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
command-line
io-redirection
cat
Zain Rafi
źródło
źródło
cat < food
zamiastcat < foo
food < cat
;;)cat
. Teraz zastanawiam się, skąd pochodzi druga wiadomość, biorąc pod uwagę, że zaczyna się ona odbash:
...Odpowiedzi:
To uruchamia
cat
polecenie z argumentemfoo
. Błąd wydrukowany na ekranie zależy całkowicie od decyzji programisty polecenia.Spowoduje to przekazanie zawartości pliku
foo
docat
polecenia przy użyciu przekierowania standardowego Bash . Jeśli plik nie istnieje, narzeka na niego Bash.źródło
W
$ cat foo
powłoce (tutaj bash) wykonujecat
polecenie i przekazuje parametrfoo
. 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 < foo
jest 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).
źródło
cat < foo
,cat
nie 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ż innecat < in > out
vscat in > out
gdzie byłe zapobiegaout
być przesłonięte jeśliin
nie istnieje (powłoka anuluje prawo polecenia po uszkodzonej< in
przekierowania i nie zrobić następnego> out
przekierowanie, nie mówiąc już Invokecat
).