Oto polecenie sortujące pliki w folderze w odwrotnej kolejności
ls | sort -r
Co robi |
symbol w tym poleceniu?
To, czego tak naprawdę szukam, to wyjaśnienie potoków dla początkujących na Linuksie na wysokim poziomie (łatwe do zrozumienia). Widzę inne pytania dotyczące potoków tutaj na Superużytkowniku, ale nic, co nie daje odpowiedzi, która wyjaśnia w prosty sposób, co robią i czym różnią się od przekierowania ( symbol >
lub <
).
linux
command-line
bash
pipe
ccalvert
źródło
źródło
|
jest to, że nie używa ona nazwy, dane wyjściowe z polecenia z lewej strony są przekazywane bezpośrednio do danych wejściowych dla polecenia z prawej strony potoku.ls -1r
(Zwróć uwagę na argument numer jeden) powinien dać podobny wynikls | sort -r
.cat /somefile | grep cool
. Spowoduje to, że wyjdzie z jakiegoś pliku i udostępni go do grep, a następnie grep wydrukuje wszystkie wiersze ze słowem cool.Odpowiedzi:
Poniższe zostało nieco uproszczone, aby pomóc nowym użytkownikom.
Po pierwsze, konieczne jest zrozumienie pojęcia standardowego wejścia i standardowego wyjścia.
W systemie Linux i innych systemach operacyjnych typu UNIX każdy proces ma standardowe wejście (
stdin
) i standardowe wyjście (stdout
). Zazwyczaj jeststdin
to klawiatura istdout
okno ekranu lub terminala.Więc kiedy uruchomisz
ls
, wyrzuci swoje wyjście dostdout
. Jeśli nie zrobisz nic więcej, przejdzie do ekranu lub okna terminala i wyświetlisz go.Teraz niektóre polecenia Linuksa współdziałają z użytkownikiem i używają
stdin
do tego celu, a edytor tekstowy jest jednym z nich. Czyta z,stdin
aby zaakceptować naciśnięcia klawiszy, robić rzeczy, a następnie zapisuje różne rzeczystdout
.Istnieją jednak również nieinteraktywne lub „filtrujące” polecenia, które NIE działają interaktywnie, ale wymagają dużej ilości danych. Te polecenia zabiorą wszystko
stdin
, zrób coś, a następnie wrzućstdout
Spójrzmy na inne polecenie o nazwie
du
- oznacza użycie dysku.du /usr
, na przykład wydrukuje (abystdout
polubić każde inne polecenie Linuksa) listę każdego pliku w tym katalogu i jego rozmiar:Jak widać od samego początku nietoperz, nie jest sortowany i prawdopodobnie chcesz go posortować według wielkości.
sort
jest jednym z tych poleceń „filtrujących”, które wezmą kilka rzeczystdin
i posortują je.Więc jeśli to zrobimy:
# du /usr | sort -nr
otrzymujemy to, co jest nieco lepsze:
I możesz teraz zobaczyć, że „potok” łączy
stdout
jedno poleceniestdin
z drugim. Zazwyczaj używasz go w takich sytuacjach, w których chcesz filtrować, sortować lub w inny sposób manipulować wyjściem polecenia. Mogą być kaskadowane, jeśli chcesz przetwarzać dane wyjściowe za pomocą wielu poleceń typu filtr.Jeśli wpiszesz
sort
sam, nadal będzie próbował czytaćstdin
. Ponieważstdin
jest podłączony do klawiatury, będzie czekał na wpisanie i przetworzenie rzeczy do momentu naciśnięcia klawisza Control-D. Nie wyświetli monitu, ponieważ tak naprawdę nie jest przeznaczony do interaktywnego używania.Program może stwierdzić, czy
stdin
jest interaktywny, czy nie, więc niektóre programy mogą działać inaczej, jeśli wydasz je samodzielnie lub na końcu potoku.Ponadto, potokowanie programu, który działa tylko interaktywnie, na przykład
vi
, spowoduje, że będziesz miał zły czas.Rurki różnią się od przekierowania tym, że dane są losowo przenoszone z jednego polecenia do drugiego, ale nie są nigdzie przechowywane. W powyższym przykładzie
du
dane wyjściowe nie są nigdzie przechowywane. W większości przypadków nie chcesz tego z potokami, ponieważ powodem użycia potoków jest w pewien sposób przetworzenie wyniku polecenia - ale istnieje polecenie,tee
które pozwala ci mieć ciasto i je zjeść, to będzie skopiuj to, co otrzyma,stdin
do obustdout
plików i wybranego pliku. Możesz to również zrobićbash
z tajemniczą składnią obejmującą ampersands i nawiasy, o których nie wiem.źródło
stdin
istdout
jest inna pod Windows niż pod Linuksem, choć prawdopodobnie nie bardzo z punktu widzenia Windowscmd.exe
lub Powershell.GetStdHandle()
. Przekierowanie standardowych strumieni spawnowanego procesu [podrzędnego] za pomocą platformy .NET jest banalne, co moim zdaniem odwzorowuje na funkcje Win32 (ale nie jestem tego w 100% pewien - nie jestem programistą Win32).STARTUPINFO
strukturze dlaCreateProcess()
.Jeśli nie masz nic przeciwko przekierowaniu danych wyjściowych i wejściowych, wyjaśnienie jest naprawdę dość proste.
robi to samo co
ale bez
tempfile
. WyjścieCommand1
jest bezpośrednio podłączone do wejścia,Command2
a przesyłanie odbywa się w pamięci.źródło
CreateFile
lubWriteFile
wezwania do poparcia roszczenia. / edit: Oczywiście dotyczy to części Windows.Naprawdę, jeśli chcesz wiedzieć, co robią potoki i różnicę między> a |, przejdź do katalogu z dużą ilością plików i
z terminala
ls
vsls | more
(lub robienie tego z systemu Windows za pomocą DIR i DIR | MORE)Jeśli użyłeś> more, zobaczysz, że tworzy on plik o nazwie „more” zamiast wysyłać dane wyjściowe ls do polecenia „more”. Więc jeśli ktoś zrobił> więcej, prawdopodobnie byłby to błąd, nie zrobiłby> więcej niż zrobiłbyś> file1. Więcej to dobrze znane polecenie.
<Jak the> służy również do łączenia polecenia i pliku, a nie polecenia z poleceniem. Ale podczas gdy>> wysyła dane wyjściowe polecenia do pliku, <wysyła plik jako dane wejściowe do polecenia. Rzadko używam <jak zwykle używam cat file1 | wysłać wynik pliku do polecenia.
$ grep a <plik1 abc
plik $ cat1 | grep a abc
grep z 2 parametrami ma postać pliku wzorca grep. grep z jednym parametrem jest wzorem grep. Możesz wysłać plik, przesyłając do niego zawartość pliku lub używając <. Jeśli używasz <, najpierw wpisz nazwę polecenia, a następnie nazwę pliku <polecenie <plik. Jeśli używasz | do potokowania zawartości pliku używasz cat file1 | dowództwo.
Również wiele poleceń pobiera plik jako dane wejściowe, więc grep plik1 będzie działał, podobnie jak plik cat1 | grep a i grep a <plik1.
Robiłem potoki (|) i> na DOSie nawet 15 lat temu.
Podsumowując, jak | różni się od <i> - potok znajduje się między 2 poleceniami <i> siedzą między poleceniem a plikiem. > Jest wyprowadzane do pliku. <Jest wprowadzane z pliku.
źródło
Znak potoku (
|
) łączy dane wyjściowe jednego programu z danymi wejściowymi innego programu.W tym przykładzie
echo
wypisuje słowohello
iwc -c
wykonuje liczbę wprowadzonych znaków:źródło
Aby to zrozumieć, spróbuj sam:
Teraz zwisasz kursorem i nic nie robi. Co się stanie, jeśli wpiszesz jakieś dane?
Nadal nic, prawda? Teraz naciśnij ctrl + D
Czym więc jest sortowanie, pobiera dane wejściowe (to, co wpisałeś), coś z tym robi (sortuje) i zwraca jako wynik.
ls
Komenda nie bierze wejście, to tylko generuje dane wyjściowe. Symbol potoku pobiera dane wyjściowels
i podaje je jako dane wejściowe dosort
polecenia.>
nie podaje danych wyjściowych do programu, ale przechowuje dane wyjściowe jako plik.<
używa pliku jako danych wejściowych.źródło