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ę:
- wysyłać wynik jednej komendy do drugiej za pomocą pipe;
- zapisywać wynik komend do plików;
- dopisywać wynik do istniejących plików;
- rozumieć standard output i standard error;
- łączyć komendy przez
&&,||i;; - używać
tee; - budować proste workflow.
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:
- Co robi
|? - Co robi
>? - Co robi
>>? - Co robi
2>? - Co robi
&&? - Co robi
||?
Mini Wyzwanie
Stwórz plik animals.txt z tymi liniami:
cat
dog
bird
cat
dog
elephant
Potem użyj komend, aby:
- Posortować plik.
- Usunąć duplikaty.
- Policzyć unikalne zwierzęta.
- Zapisać posortowaną unikalną listę do
unique-animals.txt. - 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:
- pipe wysyła output jednej komendy do drugiej;
>zapisuje output i nadpisuje pliki;>>dopisuje output;2>przekierowuje błędy;2>&1łączy normalny output i błędy;teepokazuje output i go zapisuje;;uruchamia komendy jedna po drugiej;&&uruchamia następną komendę tylko po sukcesie poprzedniej;||uruchamia następną komendę tylko po błędzie poprzedniej;- małe komendy mogą stać się mocnymi workflow, gdy je połączysz.
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:
- poruszać się po systemie plików;
- zarządzać plikami i folderami;
- czytać i wyszukiwać pliki;
- rozumieć uprawnienia;
- instalować programy;
- monitorować procesy;
- sprawdzać sieć;
- pracować z archiwami;
- używać zmiennych i aliasów;
- pisać skrypty Bash;
- łączyć komendy w workflow.
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.