Najpierw cat
zapisuje na standardowe wyjście, które niekoniecznie jest terminalem, nawet jeśli cat
zostało wpisane jako część polecenia do interaktywnej powłoki. Jeśli naprawdę potrzebujesz czegoś do zapisania na terminalu, nawet gdy przekierowane jest standardowe wyjście, nie jest to takie łatwe (musisz określić, który terminal, a może nawet nie być, jeśli polecenie zostanie wykonane ze skryptu), chociaż jeden mógłby (ab) użyć standardowego wyjścia błędu, jeśli polecenie jest tylko częścią potoku. Ale skoro wskazałeś, że to cat
rzeczywiście działa, przypuszczam, że nie pytałeś o taką sytuację.
Jeśli Twoim celem byłoby przesłanie tego, co zapisano na standardowe wyjście do potoku, wówczas użycie cat
będzie kwalifikować się do nagrody Bezużyteczne użycie kota , ponieważ cat file | pipeline
(gdzie pipeline
oznacza dowolny potok) można to zrobić bardziej efektywnie <file pipeline
. Ale znowu, z twoich sformułowań wywnioskuję, że to nie była twoja intencja.
Więc nie jest tak jasne, o co się martwisz. Jeśli nie możesz cat
pisać, możesz zdefiniować alias jedno- lub dwuznakowy (wciąż istnieje kilka takich nazw, które nie są używane w standardowym Uniksie). Jeśli jednak martwisz się, że cat
spędzasz bezużyteczne cykle, nie powinieneś.
Gdyby istniał program, null
który nie przyjmuje żadnych argumentów i po prostu kopiuje standardowe wejście na standardowe wyjście (obiekt neutralny dla potoków), możesz zrobić to, co chcesz <file null
. Nie ma takiego programu, chociaż napisanie go byłoby łatwe (program C z main
funkcją tylko jednego wiersza może wykonać zadanie), ale wywoływanie cat
bez argumentów (lub cat -
jeśli chcesz być jawny) robi właśnie to.
Jeśli istniał nocat
program, który pobiera dokładnie jeden argument nazwy pliku, próbuje otworzyć plik, narzeka, jeśli nie może, a w przeciwnym razie kontynuuje kopiowanie z pliku na standardowe wyjście, to właśnie o to prosisz. Jest to tylko nieco trudniejsze do napisania niż null
, ponieważ główną pracą jest otwieranie pliku, testowanie i być może narzekanie (jeśli jesteś skrupulatny, możesz również chcieć dołączyć test, który zawiera dokładnie jeden argument, i narzekać inaczej). Ale znowu cat
, teraz wyposażony w pojedynczy argument, robi właśnie to, więc nie ma potrzeby żadnego nocat
programu.
Po napisaniu nocat
programu, po co zatrzymywać się na jednym argumencie? Zawijanie kodu w pętlę for(;*argp!=NULL;++argp)
wcale nie stanowi żadnego wysiłku, dodaje do pliku binarnego co najwyżej kilka instrukcji maszynowych i pozwala uniknąć narzekania na niewłaściwą liczbę argumentów (co oszczędza znacznie więcej instrukcji). Voilà prymitywna wersja cat
łączenia plików. (Szczerze mówiąc, musisz go trochę ulepszyć, aby bez argumentów zachowywał się jak null
.)
Oczywiście w prawdziwym cat
programie dodali kilka dzwonków i gwizdków, ponieważ zawsze tak robią. Ale istotą jest to, że aspekt „konkatenacji” cat
kosztów naprawdę nie wymaga żadnego wysiłku, ani dla programisty, ani dla maszyny, która go wykonuje. Fakt, który cat
pochłania null
i nocat
wyjaśnia nieistnienie takich programów. Unikaj używania cat
z jednym argumentem, jeśli wynik trafia do potoku, ale jeśli jest on używany tylko do wyświetlania zawartości pliku w terminalu, nawet strona, do której dowiązałem, przyznaje, że jest to użyteczne zastosowanie cat
, więc nie wahaj się.
Możesz przetestować, który cat
jest naprawdę zaimplementowany przez prostą pętlę wokół hipotetycznej nocat
funkcjonalności, wywołując cat
kilka nazw plików, wśród których jedna jest niepoprawna, a nie na pierwszej pozycji: zamiast narzekać od razu, że ten plik nie istnieje, cat
najpierw zrzuca poprzedzające go prawidłowe pliki, a następnie narzeka na nieprawidłowy plik (przynajmniej tak zachowuje się mój kot).