W jaki sposób to polecenie jest legalne? „> Plik1 <plik2 kot”


61

Zakładając, że file2już istnieje, polecenie

> file1 < file2 cat

wydaje się kopiować zawartość file2do file1.

Ale nie mogę zrozumieć tej struktury.

Rozumiem, że „Nic” nie jest kierowane file1(tworzenie lub usuwanie jego treści). Następnie file2kierowana jest treść file1.

Dlaczego catpo file2? skąd ma wiedzieć, cat file2czy operandy nie są we właściwej kolejności?


11
Jakie „prawidłowe zamówienie”? Czy możesz podać link do niektórych zasobów / materiałów edukacyjnych, w których opisano „prawidłową kolejność”?
Wyścigi lekkości na orbicie

7
Zadając takie pytania, powinieneś podać powłokę; różne mają różne przypadki krawędzi, szczególnie wokół przekierowania.
Chrylis

Odpowiedzi:


117

Zanim powłoka wykona catpolecenie w wierszu poleceń, szuka przekierowań.

Istnieją dwa przekierowania:

  1. >file1 Spowoduje to przejście do standardowego wyjścia polecenia file1.
  2. <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]


14
@ Steve Swoboda przemieszczania przekierowań może być użyta, aby niektóre polecenia były bardziej przejrzyste, na przykład potok z przekierowaniem wejścia na początku <in foo | bar >outporządkuje wszystko w logicznej kolejności. Podoba mi się również, jeśli chodzi echo >&2 Something bad happenedo wyjście błędów ze skryptów powłoki. Ale >out <in catto tylko zaciemnienie

2
Jak można sort file >fileto poprawnie osiągnąć?
seth10

11
@setht With sort -o file file.
Kusalananda

6
Świetna odpowiedź. Pamiętaj, że kolejność ma znaczenie. < file1 > file2 catbyłoby lepiej, > file2 < file1 catponieważ uniknęłoby file2to obcinania, jeśli file1nie można go otworzyć.
Stéphane Chazelas,

3
Należy pamiętać: podczas łączenia z POSIX za pomocą fragmentów HTML lepiej jest podać dokładną edycję (np. Pubs.opengroup.org/onlinepubs/9699919799.2016edition ), ponieważ wiadomo, że fragmenty zmieniają się między edycjami tej samej wersji specyfikacji (wiele linków w odpowiedziach na tej stronie, w tym moje, są teraz niepoprawne, ponieważ fragmenty wskazują w niewłaściwym miejscu po wydaniu wersji 2016).
Stéphane Chazelas,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.