Terminal - podstawowe komendy i koncepty
Szukanie pomocy
Sprawdzanie co jest czym oraz do czego służy
- man - manual
- apropos - wyszukujemy nim słów kluczowych (np w opisach programów etc)
- whatis -
- file - opisuje typ pliku
Wyrażenia regularne
Pliki
Uprawnienia plików
Każdy plik w linuxie ma swoje uprawnienia, które są podzielone na trzy grupy:
- właściciel
u
- grupa
g
- inni
o
Każda z tych grup ma swoje uprawnienia do pliku, które są podzielone na:
- odczyt
r
- zapis
w
- wykonanie
x
Poza tym są też specjalne uprawnienia:
s
- setuid (gdy dla właściciela), setgid (gdy dla grupy), sticky bit - jest to flaga, która może mieć różne efekty w zależności od tego, czy jest ustawiona na piku, czy nafolderze. przykład- na pliku wykonywalnym - jeśli jest ustawiona to plik będzie wykonywany z uprawnieniami właściciela pliku, a nie osoby, która go uruchomiła. Tzn może być używana do uruchamiania aplikacji z uprawnieniami roota, nawet jeśli się nim nie jest.
- na folderze - jeśli setgid jest ustawiony na folderze, to każdy plik stworzony w tym folderze będzie miał grupę ustawioną na grupę folderu, a nie grupę użytkownika, który go stworzył.
Przykładowe
Wartość 0770
wszyscy w grupie mogą dodawać, usuwać i czytać sobie nawzajem pliki w folderze, ale nie mogą sobie nawzajemi pisać.
sudo chmod 0770 folder
Wartość 1770
daje takie uprawnienia jak wyżej z tą różnicą, że tylko właściciel pliku może go usunąć.
sudo chmod 1770 folder
Wartość 2770
oznacza, że wszyscy użytkownicy grupy mogą dodawać, czytać, zadpisywać i usuwać sobie nawzajem pliki w folderze.
Wartość 3770
oznacza to samo co wyżej z tą różnicą, że tylko właściciel może usuwać pliki.
pierwsza cyfra jest wynikiem sumowania sticky bit + 2 * setgid
ls -l
#-rw-r--r-- 1 user privileged_users 0 Oct 9 12:00 plik.txt
Pierwszy znak to typ pliku, a kolejne trzy grupy to uprawnienia dla właściciela, grupy i innych.
Czyli przykładowy ciąg -rw-r--r--
można rozpisać na
- pierwszy bit jako
-
(plik zwykły) (może być teżd
dla folderów) - właściciela jako
rw-
- grupę jako
r--
- i innych jako
r--
.
Można to także przedstawić w formacie zapisu liczbowego, gdzie każda grupa ma swoją wartość: r=4
, w=2
, x=1
.
#-rw-r--r--
# 110 100 100
# 6 4 4
Ten zapis może być wykorzystywany chociażby przez komendę chmod
, która przyjmuje różne waroanty argumentów link.
chmod 777 plik.txt #nadanie pełnych uprawnień wszystkim
chmod 755 plik.txt #nadanie pełnych uprawnień właścicielowi, a grupie i innym tylko odczytu i wykonania
# zapis zmieniający uprawnienia
chmod u+x plik.txt #dodanie uprawnień do wykonania dla właściciela
chmod u-x plik.txt #usunięcie uprawnień do wykonania dla właściciela
chmod g+rw plik.txt #dodanie uprawnień do odczytu i zapisu dla grupy
Szukanie plików
find -name a*n.java
Rozmiary folderów
domyślne ls
ni pokauje rozmiarów folderów. Do tego należy użyć komandy du
du -s /home/ja
Przydatne flagi:
-s
-pokaż tylko wybrany folder bez podfolderóœ-h
- human readable, zaokrągla do GB, MB etc.--max-depth=2
- maksymalna głębokość przy pokazywaniu podfolderów
Pisanie do plików
Każda aplikacja ma wejście (stdin
) oraz dwa wyjścia (stdout
-zwykłe i stderr
-dla błędów)
Z pomocą poniższych komend możemy przekierowywać wyjścia programów do urządzeń lub plików
Komenda | Działanie |
---|---|
< |
deviceredirects stdin to the device |
>> |
deviceredirects stdout to the device (appends to the end) |
> device |
redirects stdout to the device (overwrites previous content) |
2> device |
redirects stderr to the device (overwrites previous content) |
2>&1 |
redirects stderr to the device associated to stdout |
cat logi.log | grep "10-10-2022" > logs_from_10-10-2022.log
Obróbka tekstu
Wyszukiwanie wzorca
cat PLIKI | grep wyszukiwane_slowo
grep -r . #przeszukanie wszystkich plików (nawet binarnych) w danym folderze
strings służy do wypisywania stringów z plików binarnych (dobrze współdziała z grep)
strings PLIK
Inne przydatne flagi grepa
-v --invert-match |
odwrócony grep, przekazuje tylko to, co nie pasuje |
-B , --before-context=ILE |
Wypisz ILE linii po przed znaleziskiem wyświetlić |
-A , --after-context=ILE |
Wypisz ILE linii po znalezisku wyświetlić |
Dzielenie dłuższych łańcuchów znaków
cut
- proste wycinanie fragmentów tekstu
-b
byte - wydziela poszczególne bajty
echo "abcdefgh" | cut -b 1,3,5-6
# acef
echo "qwer tyui xxx" | cut -d " " -f 2 #-d delimiter (separator) -f pole
#tyui
-f
przyjmuje liczby w następujących formatach: N
, N-M
, -M
, N-
, X,Y,Z
head
- służy do pokazywania tylko wybranych linii.
cat ./dlugi_plik.log | head -n 100 #drukuje tylko 100 pierwszych linii
W wypadku, gdy chcemy wydzielić samą nazwę pliku ze ścieżki warto użyć komendy basename
basename /sciezka/do/pliku/plik.txt
# plik.txt
Manipulacja tekstem
sed
służy do nieco bardziej zaawansowanych manipulacji
echo "abcdefbc" | sed "s/bc/BC/" # zamień pierwszy pasujący ciąg (bc) na BC
#aBCdefbc
TODO
Zmienne
Zmienną tworzymy za pomocą znaku =
, który przypisuje wartość do dane identyfikatora. identyfikator=wartość
.
Aby uzyskać dostęp do zawartości używamy $
przed nazwą zmiennej.
$ msg=”Hello World”
$ echo $msg
Hello World
Wstawianie zmiennych w tekst
Jest kilka sposobów, aby mieć w sktyptach tekst, który jest zależny od sytuacji. Możemy do tego wykorzystywać:
- Zmienne
/my/path/to/${EDITED_FILE}
-
Wyniki funkcji ` dsd
Argumenty
Każda funkcja, czy też skrypt bashowy może mieć przekazywane poprzez proste podanie ich po wywołaniu.
Dla skryptu:
#!/bin/bash
wyprintuj_argument()
{
#tutaj odwołujemy się do pierwszego argumentu przekazanego do funkcji
#a nie do skryptu
echo "argument $1"
}
wyprintuj_argument $1
wyprintuj_argument $2
przy wywołaniu ./skr.sh Hello 222
Otrzymamy
argument Hello
argument 222
Zwroty przydatne przy obsłudze argumentów
$0 | Nazwa wołanej komendy/skryptu |
$1 $2 $3 | poszczególne argumenty (pierwszy, drugi, trzeci) |
$# | Liczba argumentów |
$* | Wszystkie argumenty jako jeden string |
$@ | Wszystkie argumenty jako lista |
xargs
Jeśli chcemy wykorzystywać wyjścia mechanizm strumieni do przekazywania argumentów to możemy użyć także komendy xargs
#Wywołanie komendy rm dla każdego znalezionego pliku
find /path -type f -print | xargs rm
Flagi:
-n
- maksymalna liczba argumentów-d
,--delimiter
- podział na części (komenda zostanie wywołana wielokrotnie)
echo -n 123-456-7890 | xargs echo
#> 123-456-7890
echo -n "123-456-789" | xargs -n 1 -d - echo
#> 123
#> 456
#> 789
-I
,-i
,--replace=
pozwala na elastyczne wstawianie otrzymanego argumentu
#Stworzy pliki 123.txt 456.txt 789.txt
echo -n "123-456-789" | xargs -d - -n 1 -I{} echo {}.txt
Procesy
Łączniki:
&&
-wykonaj kolejny proces, jeśli poprzedni się powiedzie (retcode 0)||
- wykonaj następny, gdy poprzedni to porażka&
- proces jest utuchamiany w tle (jego pid można zdobyć za pomocą$!
)
TODO więcej
Warunki
Warunki sprawdza się za pomocą komendy test
z odpowiednimi flagami.
Można to także robić za pomocą wmieszczając warunek w nawiasach []
.
Możliwy jest też wariant z dwoma nawiasami [[ cośtam ]]
jest on wspierany przez wszystkie nowsze systemy używające Basha, ale mimo wszystko może byc on niekompatybilny ze starszymi.
Warto pamiętać, że bardzo ważne tu są spacje i aby o nich nie zapomnieć.
Samo test
jako komenda nie robi nic po prostu sprawdza warunek i zależnie od niego zwraca jakiś kod.
[ 1 -gt 100 ]
echo "Ret: $?" #zwraca kod ostatnio działającej aplikacji
# Ret: 1
[ 100 -gt 1 ]
echo "Ret: $?"
# Ret: 0
Operator | Description |
---|---|
! EXPRESSION | The EXPRESSION is false. |
-n STRING | The length of STRING is greater than zero. |
-z STRING | The lengh of STRING is zero (ie it is empty). |
STRING1 = STRING2 | STRING1 is equal to STRING2 |
STRING1 != STRING2 | STRING1 is not equal to STRING2 |
INTEGER1 -eq INTEGER2 | INTEGER1 is numerically equal to INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 is numerically greater than INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 is numerically less than INTEGER2 |
-d FILE | FILE exists and is a directory. |
-e FILE | FILE exists. |
-r FILE | FILE exists and the read permission is granted. |
-s FILE | FILE exists and it's size is greater than zero (ie. it is not empty). |
-w FILE | FILE exists and the write permission is granted. |
-x FILE | FILE exists and the execute permission is granted. |
Dopiero po połączeniu z wyrażeniami warunkowymi się przydaje.
Uwagi
=
oraz-eq
działają inaczej np01 = 1
da fałsz, ale01 -eq 1
da prawdę
Warunki if
#nie musi tu być koniecznie test, może to być dowolna. Jeśli zwraca ona 0 to mamy sukces i wchodzimy do środka
if apka_zwracająca_jakiś_kod
then
komendy
fi
#wariant z else
if apka_zwracająca_jakiś_kod
then
komendy
else
inne komendy
fi
Pętle
for - iteruje po liście
for variable in valuelist
do
something
done
Listą mogą być argumenty programu
#!/bin/bash
echo The number of arguments is: $#
echo The entered command line is: $0 $@
echo The command arguments are:
for i in "$@"
do
echo $i
done
... albo pliki w folderze
for k in *
do
cp $k $k.bak
echo $k copy created
done
lub wynik komendy (używamy do tego $()
)
for i in $(ls)
do
echo $i
done
//TODO opis skrótów klawiszowych Ctrl-C Ctrl-D etc // https://www.howtogeek.com/howto/ubuntu/keyboard-shortcuts-for-bash-command-shell-for-ubuntu-debian-suse-redhat-linux-etc/