Polecenia i operatory Bash

Ukończone

Każdy język powłoki ma najczęściej używane polecenia. Zacznij budować swój repertuar powłoki Bash, sprawdzając najczęściej używane polecenia.

Polecenia powłoki Bash

Przyjrzyjmy się typowym poleceniom powłoki Bash i zobaczmy, jak ich używać.

ls polecenie

Polecenie ls wyświetla listę zawartości bieżącego katalogu lub katalogu określonego w argumencie polecenia. Polecenie użyte samo wyświetla listę plików i katalogów w bieżącym katalogu:

ls

Pliki i katalogi, których nazwy zaczynają się kropką, są domyślnie ukryte. Aby uwzględnić te elementy na liście katalogów, użyj flagi -a:

ls -a

Aby uzyskać jeszcze więcej informacji na temat plików i katalogów w bieżącym katalogu, użyj flagi -l:

ls -l

Oto przykładowe dane wyjściowe z katalogu zawierającego kilka plików JPEG i PNG oraz podkatalog o nazwie gifs:

-rw-rw-r-- 1 azureuser azureuser  473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser  473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser  423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser    4096 Jun 13 20:16 gifs

Każdy wiersz zawiera szczegółowe informacje o odpowiednim pliku lub katalogu. Te informacje obejmują uprawnienia przypisane do pliku lub katalogu, jego właściciela, rozmiar w bajtach, czas ostatniej modyfikacji oraz nazwę pliku lub katalogu.

cat polecenie

Załóżmy, że chcesz zobaczyć, co znajduje się w pliku. W tym celu możesz użyć polecenia cat. Dane wyjściowe nie będą miały większego sensu, chyba że plik jest plikiem tekstowym. Następujące polecenie pokazuje zawartość pliku os-release przechowywanego w katalogu /etc:

cat /etc/os-release

Jest to przydatne polecenie, ponieważ informuje, z której dystrybucji systemu Linux korzystasz:

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Katalog /etc jest szczególnym katalogiem w systemie Linux. Zawiera pliki konfiguracji systemu. Nie należy usuwać plików z tego katalogu, chyba że wiesz, co robisz.

sudo polecenie

Niektóre polecenia powłoki Bash mogą być uruchamiane tylko przez użytkownika głównego; administrator systemu lub superużytkownik. Próba wykonania jednego z tych poleceń bez wystarczających uprawnień zakończy się niepowodzeniem. Na przykład tylko użytkownicy zalogowani jako superużytkownik mogą użyć polecenia cat do wyświetlenia zawartości pliku /etc/at.deny:

cat /etc/at.deny

at.deny to specjalny plik, który określa, kto może używać innych poleceń usługi Bash do przesyłania zadań do późniejszego wykonania.

Nie chcesz uruchamiać jako główny przez większość czasu; to zbyt niebezpieczne. Aby uruchomić polecenia, które wymagają uprawnień administratora bez logowania się jako superużytkownik, należy wstępnie zawężyć polecenia za pomocą polecenia sudo:

sudo cat /etc/at.deny

sudo oznacza "superużytkownik do". Gdy używasz go, informujesz powłokę, że dla tego jednego polecenia działasz z poziomem uprawnień użytkownika głównego.

Polecenia cd, mkdir i rmdir

Polecenie cd to skrót od „change directory” („zmień katalog”) i robi dokładnie to, co sugeruje jego nazwa — zmienia katalog bieżący na inny katalog. Umożliwia przejście z jednego katalogu do innego, tak jak jego odpowiednik w systemie Windows. Następujące polecenie powoduje zmianę na podkatalog bieżącego katalogu o nazwie orders:

cd orders

Możesz przenieść katalog w górę, określając .. jako nazwę katalogu:

cd ..

To polecenie powoduje zmianę katalogu macierzystego; podczas pierwszego logowania:

cd ~

Katalogi można tworzyć za pomocą polecenia mkdir. Następujące polecenie tworzy podkatalog o nazwie orders w bieżącym katalogu roboczym:

mkdir orders

Jeśli chcesz utworzyć podkatalog i kolejny podkatalog pod nim za pomocą jednego polecenia, użyj flagi --parents:

mkdir --parents orders/2019

Polecenie rmdir usuwa (usuwa) katalog, ale tylko wtedy, gdy jest pusty. Jeśli nie jest ona pusta, zostanie wyświetlone ostrzeżenie. Na szczęście możesz użyć rm polecenia , aby usunąć katalogi, które nie są puste w połączeniu -r z flagą (rekursywna). Polecenie będzie wyglądać następująco: rm -r.

rm polecenie

Polecenie rm to skrót od "remove". Jak można się spodziewać, rm usuwa pliki. Zatem następujące polecenie usuwa plik 0001.jpg:

rm 0001.jpg

A to polecenie usuwa wszystkie pliki w bieżącym katalogu:

rm *

Uważaj na polecenie rm. To niebezpieczne polecenie.

Uruchomienie polecenia rm z flagą -i pozwala zastanowić się przed usunięciem:

rm -i *

Wyrób sobie nawyk dołączania flagi -i do każdego polecenia rm, a być może nie padniesz ofiarą jednego z największych błędów systemu Linux. Budzące postrach polecenie rm -rf / usuwa każdy plik na całym dysku. Działa poprzez cykliczne usuwanie wszystkich podkatalogów katalogu głównego i ich podkatalogów. Flaga -f (od „force” — „wymuś”) czyni problem bardziej złożonym, powodując pomijanie monitów. Nie rób tego.

Jeśli chcesz usunąć podkatalog o nazwie orders, który nie jest pusty, możesz użyć polecenia rm w następujący sposób:

rm -r orders

Spowoduje to usunięcie podkatalogu orders i wszystkich zawartych w nim elementów, w tym innych podkatalogów.

cp polecenie

Polecenie cp kopiuje nie tylko pliki, ale całe katalogi (i podkatalogi), jeśli tylko tego chcesz. Aby utworzyć kopię pliku 0001.jpg o nazwie 0002.jpg, użyj następującego polecenia:

cp 0001.jpg 0002.jpg

Jeśli plik 0002.jpg już istnieje, powłoka Bash dyskretnie je zastępuje. Dobrze, jeśli to działanie było zamierzone, ale gorzej, jeśli robiąc to, nie masz pojęcia, że właśnie zastępujesz starszą wersję.

Na szczęście jeśli użyjesz flagi -i (od „interactive” — „tryb interaktywny”), powłoka Bash ostrzeże Cię przed usunięciem istniejących plików. To jest znacznie bezpieczniejsze:

cp -i 0001.jpg 0002.jpg

Oczywiście możesz użyć symboli wieloznacznych, aby skopiować kilka plików jednocześnie. Aby skopiować wszystkie pliki znajdujące się w bieżącym katalogu do podkatalogu o nazwie photos, użyj tego polecenia:

cp * photos

Aby skopiować wszystkie pliki z podkatalogu o nazwie photos do podkatalogu o nazwie images, użyj tego polecenia:

cp photos/* images

Tutaj założono, że katalog images już istnieje. Jeśli tak nie jest, możesz go utworzyć i skopiować zawartość katalogu photos za pomocą następującego polecenia:

cp -r photos images

-r Oznacza "rekursywne". Dodatkową zaletą -r flagi jest to, że jeśli zdjęcia zawierają własne podkatalogi, są one również kopiowane do katalogu images.

ps polecenie

Polecenie ps dostarcza migawkę wszystkich aktualnie uruchomionych procesów. Sama w sobie, bez argumentów, pokazuje wszystkie procesy powłoki; innymi słowy, nie wiele. Ale sprawa ma się zupełnie inaczej, jeśli dołączysz flagę -e:

ps -e

Polecenie -e wyświetla listę wszystkich uruchomionych procesów, a zwykle jest ich wiele.

Aby uzyskać pełniejsze informacje na temat procesów uruchomionych w systemie, użyj flagi -ef:

ps -ef 

Ta flaga umożliwia wyświetlenie nazw wszystkich uruchomionych procesów, ich numerów identyfikacyjnych procesu (PID), identyfikatorów PID ich elementów nadrzędnych (PPID) i czasu ich rozpoczęcia (STIME). Wyświetla również informacje o terminalu, do którego są dołączone (TTY) (jeśli istnieje), ile czasu procesora CPU wykorzystały i ich pełne nazwy ścieżek. Oto skrócony przykład:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:35 ?        00:00:03 /sbin/init
root          2      0  0 13:35 ?        00:00:00 [kthreadd]
root          3      2  0 13:35 ?        00:00:00 [rcu_gp]
root          4      2  0 13:35 ?        00:00:00 [rcu_par_gp]
root          5      2  0 13:35 ?        00:00:00 [kworker/0:0-cgr]
root          6      2  0 13:35 ?        00:00:00 [kworker/0:0H-kb]
root          8      2  0 13:35 ?        00:00:00 [mm_percpu_wq]
root          9      2  0 13:35 ?        00:00:01 [ksoftirqd/0]
root         10      2  0 13:35 ?        00:00:02 [rcu_sched]

Oprócz tego możesz również znaleźć dokumentację, która pokazuje użycie polecenia ps w następujący sposób:

ps aux

Polecenia ps aux i ps -ef działają tak samo. Ta podwójność wywodzi się z historycznych różnic między systemami POSIX Unix (do których należy system Linux) i systemami BSD Unix (z których najpopularniejszym jest system macOS). Na początku systemy POSIX używały flagi -ef, podczas gdy systemy BSD wymagały opcji aux. Obecnie obie rodziny systemów operacyjnych akceptują jeden z dwóch formatów.

Stanowi to doskonałe przypomnienie, dlaczego należy uważnie zapoznać się z podręcznikiem dla wszystkich poleceń systemu Linux. Nauka powłoki Bash przypomina naukę angielskiego jako drugiego języka. Istnieje wiele wyjątków od reguł.

w polecenie

Użytkownicy przychodzą i odchodzą, a czasami trafiają się tacy, których w ogóle nie chcesz. Gdy pracownik odchodzi z firmy, administrator systemu jest wzywany, aby upewnić się, że pracownik nie będzie już mógł logować się do systemów komputerowych firmy. Oczekuje się również, że administratorzy systemu wiedzą, kto jest zalogowany i kto nie powinien być.

Aby dowiedzieć się, kto jest zalogowany na serwerach, system Linux udostępnia polecenie w (od „who” — „kto”). Wyświetla ono informacje o użytkownikach aktualnie znajdujących się w systemie komputerowym i działaniach tych użytkowników. Polecenie w pokazuje nazwy użytkowników, ich adresy IP, kiedy się zalogowali, jakie procesy aktualnie działają i ile czasu te procesy zużywają. Jest to cenne narzędzie dla administratorów systemu.

Operatory we/wy powłoki Bash

W systemie Linux możesz zrobić bardzo dużo, wykorzystując polecenia Bash i ich wiele opcji. Ale naprawdę możesz wykonać pracę, łącząc polecenia za pomocą operatorów we/wy:

  • < do przekierowywania danych wejściowych do źródła innego niż klawiatura
  • > do przekierowania danych wyjściowych do miejsca docelowego innego niż ekran
  • >> do zrobienia tego samego, ale przez dołączanie, a nie zastępowanie
  • | do przesyłania potokowego danych wyjściowych z jednego polecenia do danych wejściowych innego

Załóżmy, że chcesz wyświetlić wszystkie elementy w bieżącym katalogu, ale przechwycić dane wyjściowe w pliku o nazwie listing.txt. Następujące polecenie właśnie to robi:

ls > listing.txt

Jeśli plik listing. txt już istnieje, zostanie zastąpiony. Jeśli zamiast tego użyjesz operatora >>, dane wyjściowe z polecenia ls zostaną dołączone do tego, co już znajduje się w pliku listing.txt:

ls >> listing.txt

Operator przesyłania potokowego jest niezwykle wydajny (i często używany). Przekierowuje on dane wyjściowe pierwszego polecenia do danych wejściowych drugiego polecenia. Załóżmy, że używasz polecenia cat do wyświetlania zawartości dużego pliku, ale zawartość przewija się zbyt szybko, aby można ją było przeczytać. Możesz sprawić, by dane wyjściowe były łatwiejsze do ogarnięcia, przesyłając potokowo wyniki do innego polecenia, takiego jak more. Następujące polecenie wyświetla listę wszystkich aktualnie uruchomionych procesów. Jednak po zapełnieniu ekranu dane wyjściowe są wstrzymywane, dopóki nie wybierzesz klawisza Enter, aby wyświetlić następny wiersz:

ps -ef | more

Możesz także przesłać potokowo dane wyjściowe do polecenia head, aby zobaczyć tylko kilka pierwszych wierszy:

ps -ef | head

Załóżmy też, że chcesz filtrować dane wyjściowe, aby uwzględnić tylko wiersze zawierające słowo "demon". Jednym ze sposobów, aby to zrobić, jest potokowanie danych wyjściowych z ps do przydatnego grep narzędzia systemu Linux:

ps -ef | grep daemon

Dane wyjściowe mogą wyglądać następująco:

azureus+  52463  50702  0 23:28 pts/0    00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root        449      1  0 13:35 ?        00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root        988      1  0 13:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+   1002      1  0 13:35 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     1035      1  0 13:35 ?        00:00:00 /usr/sbin/atd -f
root       1037      1  0 13:35 ?        00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root       1039      1  0 13:35 ?        00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+  52477  50702  0 23:28 pts/0    00:00:00 grep --color=auto daemon

Możesz także użyć plików jako danych wejściowych. Domyślnie standardowe dane wejściowe pochodzą z klawiatury, ale to również można przekierować. Aby pobrać dane wejściowe z pliku zamiast z klawiatury, użyj operatora <. Jednym z typowych zadań administratora systemu jest sortowanie zawartości pliku. Jak sama nazwa wskazuje, polecenie sort sortuje tekst w kolejności alfabetycznej:

sort < file.txt

Aby zapisać posortowane wyniki do nowego pliku, możesz przekierować dane wejściowe i dane wyjściowe:

sort < file.txt > sorted_file.txt

Możesz użyć operatorów we/wy do łączenia poleceń systemu Linux odpowiednio do potrzeb. Spójrzmy na następujące polecenie:

cat file.txt | fmt | pr | lpr

Dane wyjściowe z polecenia cat trafiają do polecenia fmt, dane wyjściowe z polecenia fmt idą do polecenia pr i tak dalej. Polecenie fmt formatuje wyniki w schludny akapit. Polecenie pr dzieli wyniki na strony. A polecenie lpr wysyła podzielone na strony dane wyjściowe do drukarki. Wszystko w jednym wierszu!