Zakładając, że file2
już istnieje, polecenie
> file1 < file2 cat
wydaje się kopiować zawartość file2
do file1
.
Ale nie mogę zrozumieć tej struktury.
Rozumiem, że „Nic” nie jest kierowane file1
(tworzenie lub usuwanie jego treści). Następnie file2
kierowana jest treść file1
.
Dlaczego cat
po file2
? skąd ma wiedzieć, cat file2
czy operandy nie są we właściwej kolejności?
shell
io-redirection
shaqed
źródło
źródło
Odpowiedzi:
Zanim powłoka wykona
cat
polecenie w wierszu poleceń, szuka przekierowań.Istnieją dwa przekierowania:
>file1
Spowoduje to przejście do standardowego wyjścia poleceniafile1
.<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.
jest taki sam jak
który jest taki sam jak
itd .¹
Zauważ, że
cat
narzędzie we wszystkich tych instancjach jest uruchamiane bez żadnych argumentów wiersza poleceń . Przekierowania nie są operandamicat
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
icat <file
(lub, jeśli wolisz<file cat
) polega na tym, że w pierwszym przypadkucat
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łączcat
do niego strumień wejściowy². W drugim przypadkucat
zauważy, że nie otrzymał operandu pliku i automatycznie przełączy się na odczyt ze standardowego wejścia. Jest to cechacat
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 dlacat
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ślifile2
jest niedostępny (na przekierowania są przetwarzane od lewej do prawej). Względne umiejscowienie słowacat
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:
Tutaj powłoka obcina (opróżnia) plik
file
przed wykonaniemsort file
i podłączeniemsort
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 dofile
.Środkiem zaradczym w tym konkretnym przypadku (do sortowania pliku „na miejscu”) jest
lub
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ń:
A także o tym, że przekierowanie nie jest częścią argumentów narzędzia:
źródło
<in foo | bar >out
porządkuje wszystko w logicznej kolejności. Podoba mi się również, jeśli chodziecho >&2 Something bad happened
o wyjście błędów ze skryptów powłoki. Ale>out <in cat
to tylko zaciemnieniesort file >file
to poprawnie osiągnąć?sort -o file file
.< file1 > file2 cat
byłoby lepiej,> file2 < file1 cat
ponieważ uniknęłobyfile2
to obcinania, jeślifile1
nie można go otworzyć.