Zanim powłoka wykona cat
polecenie 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 cat
narzędzie we wszystkich tych instancjach jest uruchamiane bez żadnych argumentów wiersza poleceń . Przekierowania nie są operandami cat
polecenia, 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 file
i cat <file
(lub, jeśli wolisz <file cat
) polega na tym, że w pierwszym przypadku cat
samo 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 cat
do niego strumień wejściowy². W drugim przypadku cat
zauważy, że nie otrzymał operandu pliku i automatycznie przełączy się na odczyt ze standardowego wejścia. Jest to cecha cat
i niektóre inne narzędzia, a nie coś, co robią wszystkie narzędzia.
cat
odczyta również ze swojego standardowego wejścia, jeśli otrzyma operand -
. Ponownie, jest to specjalne tylko dla cat
niektórych innych narzędzi (tj. Nic, co robi powłoka ). Aby użyć cat
dla 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, file1
nie zostanie obcięta, jeśli file2
jest niedostępny (na przekierowania są przetwarzane od lewej do prawej). Względne umiejscowienie słowa cat
jest 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 file
przed wykonaniem sort file
i podłączeniem sort
standardowego wyjścia do pliku. sort
Narzędzie następnie otworzyć file
i 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 sort
działa, gdy używa się -o
pliku 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]