← Back to course

Pipe, Przekierowania i Łączenie Komend

Pipe, Przekierowania i Łączenie Komend

Witaj ponownie.

W poprzedniej lekcji napisałeś pierwszy skrypt Bash.

Teraz poznajemy jedną z najpotężniejszych idei terminala Linux:

Łączenie komend.

Małe komendy są użyteczne.

Połączone komendy są potężne.

Tutaj terminal przestaje być listą osobnych narzędzi i staje się warsztatem.

Trochę chaotycznym warsztatem.

Ale nadal warsztatem.

Czego Się Nauczysz

W tej lekcji nauczysz się:

Misja

Twoja misja jest prosta:

Nauczyć się sprawiać, żeby komendy pracowały razem.

Bo jedna komenda jest użyteczna.

Trzy komendy połączone razem mogą sprawić, że wyglądasz jak ktoś, kto potajemnie pracuje w NASA.

Z laptopem.

I podejrzaną ilością snu.

Czym Jest Pipe?

Pipe wysyła wynik jednej komendy do drugiej.

Symbol pipe to:

|

Przykład:

ls | wc -l

To znaczy:

Wypisz pliki, potem policz linie.

ls tworzy output.

wc -l liczy linie.

Pipe je łączy.

Bardzo elegancko.

Bardzo linuksowo.

Liczenie Plików w Folderze

Spróbuj:

ls

Teraz spróbuj:

ls | wc -l

Zobaczysz liczbę.

Ta liczba mówi, ile linii wypisało ls.

Nie zawsze idealne dla złożonych przypadków, ale dobre do nauki.

Terminal przekazuje teraz informacje jak kelner noszący talerze między komendami.

Oby bez upuszczania.

Szukanie w Wyniku Komendy

Możesz przekazać output do grep.

Spróbuj:

ls | grep ".txt"

To pokazuje tylko elementy zawierające .txt.

Możesz też szukać procesów:

ps aux | grep node

To znaczy:

Pokaż wszystkie procesy, potem zostaw tylko linie z node.

To bardzo użyteczne podczas debugowania serwerów developerskich.

Zwłaszcza gdy Node.js nie chce odejść jak gość po północy.

Sortowanie Outputu

Stwórz mały plik:

echo "banana" > fruits.txt
echo "apple" >> fruits.txt
echo "orange" >> fruits.txt
echo "apple" >> fruits.txt

Pokaż go:

cat fruits.txt

Teraz posortuj:

cat fruits.txt | sort

Powinieneś zobaczyć linie w kolejności alfabetycznej.

Usuwanie Duplikatów

Aby usunąć sąsiadujące duplikaty, użyj uniq.

Najlepiej najpierw z sort:

cat fruits.txt | sort | uniq

To znaczy:

Wypisz plik, posortuj linie, usuń duplikaty.

Małe komendy.

Mocny wynik.

Jak robienie kanapki, ale z tekstem.

Liczenie Unikalnych Wartości

Możesz dodać wc -l:

cat fruits.txt | sort | uniq | wc -l

To liczy, ile masz unikalnych owoców.

Komenda wygląda już dłużej.

Ale jest czytelna, gdy rozumiesz przepływ:

cat -> sort -> uniq -> count

To magia pipe.

Przekierowanie Outputu do Pliku

Symbol > zapisuje output do pliku.

Spróbuj:

echo "Hello, file!" > output.txt

Teraz przeczytaj:

cat output.txt

Powinieneś zobaczyć:

Hello, file!

Ważne: > nadpisuje plik.

Jeśli plik miał wcześniej treść, zostanie zastąpiona.

Linux nie mówi:

“Czy na pewno?”

Linux mówi:

“Zrobione.”

Zimno. Skutecznie. Trochę strasznie.

Dopisywanie Outputu do Pliku

Symbol >> dopisuje output na końcu.

Spróbuj:

echo "First line" > notes.txt
echo "Second line" >> notes.txt
echo "Third line" >> notes.txt
cat notes.txt

Powinieneś zobaczyć:

First line
Second line
Third line

Używaj:

>

aby zastąpić.

Używaj:

>>

aby dopisać.

Ta różnica ma znaczenie.

Duże.

Przekierowanie Błędów

Są dwa popularne strumienie outputu:

stdout = normalny output
stderr = output błędów

Normalny output można przekierować przez:

>

Błędy można przekierować przez:

2>

Spróbuj:

ls missing-folder 2> error.log

Teraz przeczytaj plik błędu:

cat error.log

Powinieneś zobaczyć zapisany komunikat błędu.

To przydatne, gdy skrypty produkują błędy i chcesz je zapisać.

Bo czasem błędy nie są katastrofą.

Są dowodem.

Zapisywanie Outputu i Błędów Razem

Aby zapisać normalny output i błędy razem:

command > output.log 2>&1

Przykład:

ls ~/terminal-practice missing-folder > result.log 2>&1

Potem:

cat result.log

To zapisuje poprawny output i błędy w tym samym pliku.

Bardzo przydatne dla logów.

Bardzo nudne.

Bardzo profesjonalne.

Używanie tee

tee pozwala widzieć output i zapisywać go jednocześnie.

Spróbuj:

echo "Terminal power" | tee message.txt

Zobaczysz tekst na ekranie i zostanie on zapisany do message.txt.

Aby dopisać przez tee, użyj:

echo "Another line" | tee -a message.txt

tee jest przydatne, gdy chcesz widzieć wynik i mieć log.

Jak powiedzieć:

“Chcę widzieć, co się dzieje, ale chcę też paragony.”

Łączenie Komend przez ;

Symbol ; uruchamia komendy jedna po drugiej.

echo "One"; echo "Two"; echo "Three"

Nawet jeśli jedna komenda się nie uda, następna i tak zostanie uruchomiona.

Przykład:

mkdir demo; cd demo; pwd

To proste łączenie komend.

Przydatne.

Ale nie zawsze bezpieczne.

Łączenie Komend przez &&

Symbol && uruchamia następną komendę tylko wtedy, gdy poprzednia zakończy się sukcesem.

Przykład:

mkdir safe-demo && cd safe-demo && pwd

To znaczy:

Stwórz folder. Jeśli się uda, wejdź do niego. Jeśli się uda, pokaż lokalizację.

To bezpieczniejsze niż ;.

Jeśli coś się nie uda, łańcuch się zatrzymuje.

Bardzo użyteczne w skryptach i setupach.

Mniej dramatu.

Więcej kontroli.

Łączenie Komend przez ||

Symbol || uruchamia następną komendę tylko wtedy, gdy poprzednia się nie uda.

Przykład:

mkdir safe-demo || echo "Folder already exists or could not be created."

Inny przykład:

ping -c 1 example.com || echo "Network problem."

To przydatne dla komunikatów awaryjnych.

Terminal mówi:

“Jeśli to się nie uda, zrób tamto.”

Bardzo praktyczne.

Bardzo dorośle.

Łączenie Wszystkiego

Mały workflow:

ps aux | grep node > node-processes.txt
cat node-processes.txt

To znajduje procesy Node.js i zapisuje je do pliku.

Inny przykład:

ls -la | tee files.log | grep ".txt"

To znaczy:

Pokaż pliki ze szczegółami, zapisz pełny output do files.log, a na ekranie pokaż tylko .txt.

Teraz gotujemy.

Terminalowo.

Bez patelni.

Tylko pipe.

Częste Błędy

Przypadkowe nadpisanie pliku

To nadpisuje:

echo "new text" > notes.txt

To dopisuje:

echo "new text" >> notes.txt

Przed użyciem > pomyśl.

Twoje pliki zasługują przynajmniej na sekundę szacunku.

Zapomnienie, że pipe przekazuje output, nie pliki

To działa:

cat fruits.txt | sort

Ale wiele komend może czytać pliki bezpośrednio:

sort fruits.txt

Pipe są potężne, ale nie używaj ich tylko po to, żeby wyglądać cool.

Terminal wie, kiedy udajesz.

grep znajduje samego siebie

Kiedy uruchamiasz:

ps aux | grep node

możesz zobaczyć też komendę grep node.

To normalne.

Możesz tego uniknąć tak:

ps aux | grep "[n]ode"

Mały trik.

Użytkownicy Linuxa kochają małe triki.

Czasem za bardzo.

Praktyka

Spróbuj:

cd ~/terminal-practice
echo "banana" > fruits.txt
echo "apple" >> fruits.txt
echo "orange" >> fruits.txt
echo "apple" >> fruits.txt
cat fruits.txt
cat fruits.txt | sort
cat fruits.txt | sort | uniq
cat fruits.txt | sort | uniq | wc -l
echo "Saved output" > saved.txt
echo "Appended output" >> saved.txt
cat saved.txt
ls missing-folder 2> error.log
cat error.log

Potem odpowiedz:

  1. Co robi |?
  2. Co robi >?
  3. Co robi >>?
  4. Co robi 2>?
  5. Co robi &&?
  6. Co robi ||?

Mini Wyzwanie

Stwórz plik animals.txt z tymi liniami:

cat
dog
bird
cat
dog
elephant

Potem użyj komend, aby:

  1. Posortować plik.
  2. Usunąć duplikaty.
  3. Policzyć unikalne zwierzęta.
  4. Zapisać posortowaną unikalną listę do unique-animals.txt.
  5. Pokazać wynik na ekranie i zapisać go jednocześnie przez tee.

Bez myszy.

Mysz ukończyła kurs jako obserwator.

Podsumowanie

Dzisiaj nauczyłeś się, że:

To jedna z najgłębszych idei terminala Linux.

Rób jedną rzecz dobrze.

Potem połącz te rzeczy.

To filozofia Unix w praktyce.

Kurs Ukończony

Gratulacje.

Ukończyłeś Kurs Terminala Linux.

Zacząłeś od tajemniczego czarnego okna.

Teraz potrafisz:

Terminal nie jest już potworem.

Jest narzędziem.

Ostrym narzędziem.

Potężnym narzędziem.

Narzędziem, które nadal zasługuje na szacunek.

Teraz ćwicz.

Ostrożnie.

I może najpierw zrób backup.