Zanim powłoka wykona catpolecenie w wierszu poleceń, szuka przekierowań.
Istnieją dwa przekierowania:
>file1 Spowoduje to przejście do standardowego wyjścia polecenia file1.
<file2 Spowoduje to, że standardowe wejście polecenia będzie pochodzić file2.
Fakt, że te przekierowania są umieszczone w dziwnym miejscu w wierszu poleceń, nie ma znaczenia.
$ cat <file2 >file1
jest taki sam jak
$ <file2 cat >file1
który jest taki sam jak
$ <file2 >file1 cat
itd .¹
Zauważ, że catnarzędzie we wszystkich tych instancjach jest uruchamiane bez żadnych argumentów wiersza poleceń . Przekierowania nie są operandami catpolecenia, są instrukcjami powłoki, aby skonfigurować przekierowania do i z polecenia (łącząc jego standardowe wejście i wyjście z plikami). Powłoka ustawia przekierowania przed wywołaniem polecenia.
Różnica między cat filei cat <file(lub, jeśli wolisz <file cat) polega na tym, że w pierwszym przypadku catsamo narzędzie otwiera plik, który jest podawany jako operand w wierszu poleceń, do odczytu, podczas gdy w drugim przypadku powłoka będzie otwórz plik i podłącz catdo niego strumień wejściowy². W drugim przypadku catzauważy, że nie otrzymał operandu pliku i automatycznie przełączy się na odczyt ze standardowego wejścia. Jest to cecha cati niektóre inne narzędzia, a nie coś, co robią wszystkie narzędzia.
catodczyta również ze swojego standardowego wejścia, jeśli otrzyma operand -. Ponownie, jest to specjalne tylko dla catniektórych innych narzędzi (tj. Nic, co robi powłoka ). Aby użyć catdla pliku w bieżącym katalogu, którego nazwa to - , dodaj ścieżkę do nazwy pliku, na przykład ./-.
¹ W niektórych okolicznościach kolejność przekierowań jest nadal ważna; Z cat <file2 >file1, na przykład, file1nie zostanie obcięta, jeśli file2jest niedostępny (na przekierowania są przetwarzane od lewej do prawej). Względne umiejscowienie słowa catjest jednak nadal arbitralne i nie wpłynie na to.
² Zobacz także pytanie „ cat daje inny błąd podczas otwierania nieistniejącego pliku ”.
Fakt, że powłoka ustawia przekierowania przed wykonaniem polecenia w wierszu poleceń, powoduje, że takie rzeczy zawodzą i kończy się to pustym plikiem wyjściowym:
$ sort file >file
Tutaj powłoka obcina (opróżnia) plik fileprzed wykonaniem sort filei podłączeniem sortstandardowego wyjścia do pliku. sortNarzędzie następnie otworzyć filei posortować jego zawartość (czyli nic). Wynik (nic) jest przekazywany przez standardowy strumień wyjściowy do file.
Środkiem zaradczym w tym konkretnym przypadku (do sortowania pliku „na miejscu”) jest
$ sort -o file file
lub
$ sort file >file.sorted && mv file.sorted file
co mniej więcej sortdziała, gdy używa się -opliku do określenia nazwy pliku wyjściowego.
Wystarczy wykonać kopię zapasową stwierdzenia, że przekierowania mogą poprzedzać rzeczywistą nazwę narzędzia w wierszu poleceń:
„Proste polecenie” jest sekwencją opcjonalnych przypisań zmiennych i przekierowań, w dowolnej sekwencji, opcjonalnie poprzedzonych słowami i przekierowaniami, zakończonych operatorem sterującym. [ref: POSIX Shell Command Language 2.9.1 Proste polecenia]
A także o tym, że przekierowanie nie jest częścią argumentów narzędzia:
Opcjonalny numer, operator przekierowania i słowo nie pojawiają się w argumentach przekazanych do polecenia, które ma zostać wykonane (jeśli występuje). [patrz: Przekierowanie języka poleceń POSIX Shell 2.7]