Najpierw catzapisuje na standardowe wyjście, które niekoniecznie jest terminalem, nawet jeśli catzostał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 catrzeczywiś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 catbędzie kwalifikować się do nagrody Bezużyteczne użycie kota , ponieważ cat file | pipeline(gdzie pipelineoznacza 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 catpisać, 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 catspędzasz bezużyteczne cykle, nie powinieneś.
Gdyby istniał program, nullktó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 mainfunkcją tylko jednego wiersza może wykonać zadanie), ale wywoływanie catbez argumentów (lub cat -jeśli chcesz być jawny) robi właśnie to.
Jeśli istniał nocatprogram, 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 nocatprogramu.
Po napisaniu nocatprogramu, 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 catprogramie dodali kilka dzwonków i gwizdków, ponieważ zawsze tak robią. Ale istotą jest to, że aspekt „konkatenacji” catkosztów naprawdę nie wymaga żadnego wysiłku, ani dla programisty, ani dla maszyny, która go wykonuje. Fakt, który catpochłania nulli nocatwyjaśnia nieistnienie takich programów. Unikaj używania catz 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 catjest naprawdę zaimplementowany przez prostą pętlę wokół hipotetycznej nocatfunkcjonalności, wywołując catkilka 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, catnajpierw zrzuca poprzedzające go prawidłowe pliki, a następnie narzeka na nieprawidłowy plik (przynajmniej tak zachowuje się mój kot).