Skip to content

Commit

Permalink
Merge pull request #1 from firemark/bash-content
Browse files Browse the repository at this point in the history
Bash content
  • Loading branch information
firemark committed Nov 9, 2019
2 parents b7d5432 + 26afcd5 commit 7f08546
Show file tree
Hide file tree
Showing 8 changed files with 1,044 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.swp
output/
# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down
12 changes: 12 additions & 0 deletions content/extra/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,18 @@ main a:active { color: #8bd7ff; }
padding: 0.2em 1em;
}

.admonition.info {
border-radius: 5px;
background-color: #1b92d0;
color: white;
padding: 0.2em 1em;
}

.admonition.info a { color: #ef9f5c; }
.admonition.info a:link { color: #ef9f5c; }
.admonition.info a:hover { color: #ffb87d; }
.admonition.info a:active { color: #ffe3cc; }

@media screen and (min-width: 768px) {
.cell {
width: 50%;
Expand Down
33 changes: 33 additions & 0 deletions content/howto/unix-terminal/part-1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
Title: HOWTO Unix Terminal (Część pierwsza)
Date: 2019-08-19
Slug: howto/unix-terminal/part-1
Lang: pl

[TOC]

Często zauważam że dużo początkujących nie ma żadnego pojęcia jak się poruszać po konsoli w linuxie. Uważam, że konsola w linuxie jest tak potężnym narzędziem że każdy __haker__ powinnien znać w jakimś tam minimalnym stopniu.

Zacznijmy od podstaw podstaw które mogą nam pomóc w zrozumieniu co się dzieje w konsoli:

# 1. (Prawie) wszystko jest plikiem

W linuxie prawie wszystko można potraktować coś jako plik. Czy to jest połączenie, czy to jest dysk twardy, czy to jest partycja, obrazek, sterowanie jasnością monitora to można go odczytać lub do niego zapisać (pod warunkiem że plik jest read oraz/lub write). Pozwala to na bardzo szybkie podłączenie się z swoim skryptem czy użycie prostych komend by zobaczyć co siedzi w jakimś sprzęcie. Możemy nawet zrobić 'dump' dysku przy pomocy jednej linijki w konsoli.

# 2. Procesy

!!! info ""
Jeżeli brakuje ci przykładów, to możesz przejść do komend [tutaj](/howto/unix-terminal/part-4#commands) - w razie problemów możesz wrócić tutaj

Programy w linuxie działają przez procesy, mogą sobie pracować w tle, mogą być uruchomione w konsoli (do czasu zakończenia), mamy też demony (programy uruchomione podczas startu systemu, nie widać ich ale pracują i knują jak ci zepsuć system, dlatego są demonami).
Każde uruchomienie komendy w konsoli tworzy nowy proces. A co proces może zawierać?

* `STDOUT` - strumień wyjścia, czyli to co program wyświetli/zwróci to się pojawi. Standardowo pokaże się to na ekranie konsoli.
* `STDIN` - strumień wejścia, czyli to co zostanie wprowadzone do procesu w trakcie wykonywania. Standardowo pokazuje się gdy klepiemy literki w odpowiedzi
* `STDERR` - dodatkowy strumień na błędy/warningi/informacje. Bardzo fajne gdy program generuje coś np. obrazek i wyświetli błąd na strumieniu błędów nie uszkadzając już po części wygenerowanego obrazka. wyjasnię to bardziej w przykładach później
* Argumenty - każda komenda może przyjąć argumenty. Narazie to tyle - więcej będzie w rozdziale [argumenty](/howto/unix-terminal/part-2#arguments) (czyli już za chwilę, naprawdę)
* Zmienne Środowiskowe - przy skomplikowanych programach (jak serwery baz danych) nie wystarczy podać wszystko jako argumenty - stosuje się do tego dodatkowe zmienne które można albo przekazać tylko programowi albo wyexportować w terminalu (wyjaśnię to w późniejszych działach)
* Exitcode - każdy proces jak się zakończy zwraca małą (0-255) liczbę. Jak jest 0 to oznacza że nie ma żadnego błędu, jak jest inna liczba tzn że jest program nie skończył się poprawnie.

Więcej o procesach w linuxie możesz doczytać tutaj (ENG): [https://peteris.rocks/blog/htop/](https://peteris.rocks/blog/htop/)

W tej części to na tyle, zapraszam do kolejnej [tutaj](/howto/unix-terminal/part-2).
142 changes: 142 additions & 0 deletions content/howto/unix-terminal/part-2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
Title: HOWTO Unix Terminal (Część druga)
Date: 2019-08-19
Slug: howto/unix-terminal/part-2
Lang: pl

[TOC]

# 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

!!! info ""
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:

```bash
$ 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?

```bash
$ echo $?
0
```

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

!!! info ""
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 ## {: #arguments}
Komenda `ls` może też korzystać z argumentów, które wpisujemy jako kolejne słowa

```bash
$ 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:

```bash
$ 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:

```bash
$ 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.

```bash
$ 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ą.

!!! danger ""
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

```bash
$ 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](/howto/unix-terminal/part-3).
Loading

0 comments on commit 7f08546

Please sign in to comment.