HOWTO Unix Terminal (Część druga)

Posted on Mon 19 August 2019 in unix-terminal

3a. Bash (podstawy)

Najpopularniejszą domyślną powłoką w systemach linuxowych jest bash (aczkolwiek nie najlepszą, ja preferuję zsh, inni fish shell etc) i jak na początek nam to wystarczy. Składnia bash jest bardzo pomocna do uruchomienia komend w linuxie oraz samych operacji na plikach oraz folderach.

Podstawowe komendy

Żeby łatwiej zrozumieć podstawy powłoki (shella) uznałem że potrzebujemy wiedzieć o 4 podstawowych komendach:

  • cd FOLDER zmienia aktualny folder na FOLDER.
  • echo TEKST wyświetla podany TEKST na ekranie.
  • ls wyświetla wszystkie (prawie) pliki w aktualnym folderze.
  • cat PLIK wyświetla zawartość pliku (nawet binarnego co najczęściej psuje ekran).

Podstawy

Dobry protip - bash oraz inne shella posiadają tab completion - nie musicie wpisywać całą nazwę komendy/pliku tylko wystarczy wpisać część początku słowa i kliknąć w tab - bash powinnien sam podpowiedzieć (o ile zdoła) i uzupełnić za nas

Jeżeli chcemy uruchomić jakąś komendę wystarczy że ją wpiszemy np. komendę do wyświetlania plików:

$ ls  # Komentarz
2019-07-29.jpg                    legacy_code.png
Arduino                           Library
  • Pierwsze słowo to tak zwany prompt - służy tylko do zasugerowania że to jest miejsce gdzie user może wpisywać komendy.
  • Komentarze zaczynają się od # - po # wszystko jest ignorowane do końca linii
  • Kolejne słowo to wpisana przez nas komenda - tutaj mamy ls
  • Komenda znalazła pliki oraz foldery w folderze w którym się znajduje w tej chwili program
  • Znalezione pliki oraz foldery zostały 'wyrzucone' do strumienia STDOUT, który domyślnie wyświetla na ekran wynik

Kod wyniku

a co z exit code o którym wspominaliśmy?

$ echo $?
0

w Bashu komenda $? zwraca wynik ostatniej wykonanej komendy - taki kod jest bardzo pomocny w skryptach by zweryfikować poprawność wykonania komendy

Rzadko się korzysta z $? w samym shellu - wspomniałem tutaj o tym byś miał świadomość, że wyniki wykonanej komendy istnieją i że są wykorzystywane - przyda się to na później :)

Argumenty/Parametry

Komenda ls może też korzystać z argumentów, które wpisujemy jako kolejne słowa

$ ls Arduino
accelerometer_MMA8653  alkomi  libraries  noemi  sketch_mar10a  sketch_may12a

Ta Komenda otwiera dany folder i wyświetla w nim pliki/foldery. Argumenty mogą zawierać różne opcje:

$ ls --all -l
total 3976972
drwxr-xr-x  165 firemark firemark     139264 wrz 19 23:55  .
drwxr-xr-x    4 root     root           4096 kwi 24  2018  ..
-rw-rw-r--    1 firemark firemark    1343287 lip 29 22:57  2019-07-29.jpg
drwx------    5 firemark users          4096 maj 25  2017  .adobe
drwx------    2 firemark users          4096 paź 14  2018  .alsaplayer
drwxr-xr-x    3 firemark users          4096 sty 13  2018  .altera.quartus

Użyliśmy opcję --all oraz -l:

  • --all wyświetla wszystko włącznie z . (folder aktualny) oraz .. (folder poprzedni) oraz ukrytymi plikami (zaczynającymi się na .)
  • -l wyświetla pliki/foldery w postaci listy w każdej linijce z dodatkowymi informacjami jak user, grupa, uprawnienia etc

Pewnie zauważyłeś/aś, że --all zawiera podwójny myślnik, a -l posiada tylko jeden. Dlaczego? Ponieważ przyjęło się (nie jest to reguła dla każdego programu!), że jednoliterkowa opcja posiada tylko jeden myślnik, a dłuższa opcja zawiera podwójny. Z takie odróżnienia, które są jednoznakowe a które wieloznakowe opcje, pozwala to nam lączyć jednozakowe. Wiele opcji ma aliasy w postaci jednoznakowych literek, np. w komendzie ls opcja --all można zapisać jako -a czyli:

$ ls -l --all
$ ls -l -a
$ ls -la

Wykonają takie same akcje. Kolejność jednolinijkowych opcji nie jest ważna, więc można odpalić komendę ls która zamienia wielkość w bajtach na 'ludzki' rozmiar oraz posortuje względem day:

$ ls -thor  # o ls będzie więcej w innym rozdziale - w tej chwili sie nie przejmuj co to za literki
total 3,8G
-rw-rw-r--  1 firemark 590K wrz  7 20:49  iso.png
-rw-rw-r--  1 firemark 145K wrz  8 16:17  oblique.png
drwx------  6 firemark  12K wrz 17 22:20  Downloads
-rw-rw-r--  1 firemark  82K wrz 17 22:26  x.png
-rw-rw-r--  1 firemark 2,1K wrz 18 23:24  howto-bash

Opcje mogą zawierać dodatkowe parametry np. ls posiada opcję --ignore który pozwala ignorować pliki względem wzorca np.

$ ls --ignore='*.jpg'
$ ls -I '*.jpg'

Obie komendy wykonują to samo (tzn wyświetlają wszystko poza plikami jpg). Przyjęło sie, że dla długich nazw opcji parametr jest podawany z znakiem =, a dla jednoznakowych oddziela się spacją.

To że komenda i sporo innych komend ma taką konwecję argumentów wynika tylko z dobroczynności programisty - nie każda komenda będzie się trzymać tej konwencji przykładem jest komenda find, która zostanie opisane w kolejnych działach

Foldery specjalnie

odróżniamy w zasadzie 4 specjalne foldery:

  • . - folder w którym aktualnie się znajdujemy
  • .. - folder rodzica - np. jak jesteśmy w /foo/bar/ to rodzicem jest /foo/
  • ~ - folder domowy użytkownika. Najczęściej to jest /home/<USERNAME>/
  • / - folder "root" - początek filesystemu w linuxie. Jeżeli w nazwie pliku/folderu zaczyna się od / to oznacza że adres jest stały, a nie względny

Przykłady

$ cd ~  # załóżmy że to jest /home/firemark/
$ cd magic  # załóżmy że jest taki folder
$ cat plik  # wyświetla /home/firemark/magic/plik
$ cat folder/plik  # wyświetla /home/firemark/magic/folder/plik
$ cat ./plik  # wyświetla /home/firemark/magic/plik  - tak samo jak poprzednie przyklady
$ cat ../plik  # wyświetla /home/firemark/plik  - szuka w folderze poprzednim
$ cat ~/folder/plik  # wyświetla /home/firemark/folder/plik  - szuka w folderze domowym
$ cat /plik  # wyświetla /plik

W tej części to na tyle, zapraszam do kolejnej tutaj.