RPI OS - aliasy

Spis treści

RPi OS Aliasy

Używając Malinki często sięgam do... trybu znakowego. Stary nawyk. Jeszcze z czasów Xenix!286. :D Czasami to dużo klepania. I odezwała się natura "człeka leniwego" ;)

Dość szybko sięgnąłem po... aliasy. Alias to jak synonim komendy. Można go używać "zamiast". Tworzony dla określonej komendy powłoki (tu: bash) w środowisku Linux'owym (tu: Raspbian). Często zawiera "w sobie" komendę (lub ich ciąg), czasami uzupełnionych parametrami.

Alias jest czymś w rodzaju kapsułki. Tworzy się go i używa dla: wygody, ułatwienia, czasami dla... bezpieczeństwa.

Funkcja pomocna również tym, ktorzy dopiero zaczynają swą przygodę z Rasbianem. To dla nich ten artykuł.

Trochę teorii

W przeszłości niektórzy traktowali je jako fanaberię czy objaw lenistwa. IMO to wygodne rozwiązanie służy przede wszystkim użytkownikom.

Alias jest tworzony poprzez wywołanie komendy:

~$alias <moja komenda>="<komenda systemowa>" # - można komendy uzupełniać parametrami
~$alias alias1="cos1" alias2="cos2" alias3="cos3"... # czyli można kilka za "jednym zamachem"

Aliasy ułatwiają życiePatrząc na zrzut ekranów można ocenić samemu przydatność aliasu. Treść niby ta sama, ale prezentacja wyniku działania komendy (po użyciu aliasu) po prostu jest czytelniejsza.

Aliasy udostępniane przez OS

Co ciekawe - nawet jeśli nie zdefiniujemy własnych - system (tu Raspbian OS 32b) "sam w sobie" też udostępnia aliasy.

To skutek następującego wpisu w pliku .bashrc (warto zapamiętać nazwę tego pliku), definiującego niektóre własności powłoki (tu: bash):

... # aktywuje użycie kolorów przez komendę ls oraz dodaje również kilka innych użytecznych aliasów
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'

alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
...

Wieloletnia praktyka użytkowników i rosnące możliwości używanego sprzętu pozwoliły na większą swobodę. 

By dowiedzieć się jakie aliasy zostały zdefiniowane (i nadal są aktywne) wystarczy w oknie terminala wydać polecenie:

~$ alias

Niby ok, ale czasami wywołując komendę chcemy wiedzieć: czy używamy aliasu czy komendy systemowej "w czystej postaci". Można to sprawdzić:

~ $ type ls
ls jest aliasem do ls --color=auto # ale IMO lepszym rozwiązaniem jest:

~ $ type -a ls

ls jest aliasem do ls --color=auto
ls jest /usr/bin/ls
ls jest /bin/ls
~ $

Czyli w rzeczywistości wywołując komendę np. ls możemy uzyskać dwa efekty: jeden w wyniku działania aliasu, drugi - efekt działania komendy wywołanej bez opcji.

Czy można to zrobić mimo obowiązującego aliasu. Oczywiście tak.

W celu wykonania komendy w trybie tak jak została zaimplementowana w systemie (bez uaktywnionych dodatkowych opcji) należy wywołać ją w następujący sposób: (tu na przykładzie komendy ls):

~$ \ls # komenda poprzedzona backslash'em, ewentualnie

~$ command ls


Tworzenie aliasu

Zasięg aliasu zdefiniowanego "z linii"

Stworzenie w linii komend własnego aliasu daje jednak krótkotrwały efekt. Działa jedynie podczas sesji, w której został utworzony.

O ile jest to zgodne z naszymi oczekiwaniami czy potrzeba - jest ok. Czasami np. potrzebujemy aliasu, który skróci nam żmudne kilkakrotne wklepywanie tych samych danych podczas np. sesji ssh.

Należy pamiętać, że jeśli w oknie teminala stworzysz następujący alias:

~$ alias cos="echo to jest moja komenda" # zwróć uwagę na znaki cudzysłowia otwierające i zamykające definicję aliasu

to jest on aktywny (czyli działa) tylko i wyłącznie do czasu otwartej sesji w tym (i tylko tym) oknie terminala.

Jeśli otworzysz następną sesję terminalową to w jej oknie wywołanie aliasu stworzonego w poprzednim oknie spowoduje błąd.

Aliasy permanentne (stałe)

Zaznaczyłem, że alias zdefiniowany w linii komend jest aktywny jedynie podczas sesji, podczas której alias definiowano. Po zamknieciu sesji taki alias jest kasowany.

Co zrobić, jeśli chcemy utworzyć aliasy, z których chcemy korzystać wielokrotnie. Mało tego: chcemy by po każdym logowaniu się i otwarciu sesji zdefiniowane aliasy były "gotowe do użycia".

W tym celu definicje aliasów należy umieścić w pliku o nazwie .bash_aliases (nazwa zaczyna się od kropki!), umieszczonym w katalogu domowym. I te aliasy będą aktywne podczas trwania całej sesji lub do czasu ich skasowania. To wynik tego, że w pliku .bashrc zawarto następujące działanie:

...# Definicje aliasów
# Masz możliwość - zamiast umieszczania ich bezpośrednio w pliku .bashrc -
# wpisania wszystkich swoich dodatkowych aliasów w oddzielnym pliku
# ~/.bash_aliase
# Zapoznaj się z przykładami zawartymi w /usr/share/doc/bash-doc/examples

if [ -f ~/.bash_aliases ]; then # jeśli plik .bash_aliases istnieje
. ~/.bash_aliases # wczytaj jego treść (definicje aliasów)
fi
...

Ten wpis pozwala również (bardziej zaawansowanym użytkownikom Raspbiana) dopisanie innych, własnych reguł związanych z wczytywaniem definicji aliasów.

Podczas tworzenia samemu aliasów zwróć uwagę na następujące zasady:

  • podczas tworzenia aliasów obowiązują zasady pisania poleceń powłoki systemu. Błędy w składni będą skutkować nie utworzeniem aliasu (często pojawi się komunikat) i/lub błednym jego działaniem,
  • nie wolno wykorzystywać jako nazwy aliasów następujących znaków/wyrażeń: !, case, do, done, elif, else, esac, fi, for, function, if, in, select, then, until, while, {, }, time, [, ],
  • podobnie wykorzystanie następujących znaków: *, ?, +, -, $, itp. może dać nieoczekiwane rezultaty.

Bo o ile przy próbie stworzenia aliasu "$" otrzymamy komunikat o błednej nazwie, to niestety możliwe jest utworzenie poniższych aliasów:

~$ alias ?="<coś tam>"
~$ alias *="<coś tam>"
~$ alias a="" # puste przypisanie

Najmniej szkodliwe jest ostatnie przypisanie. Po prostu alias nie robi nic (oprócz wydłużania listy aliasów). Natomiast przypisanie aliasu do "*" (gwiazdki) spowoduje kłopot. O którym za chwilę.

Jeśli można tworzyć definicje to z reguły można je kasować, dezaktywować. Podobnie jest z aliasami. Te zdefiniowane można "odwołać" poprzez komendy:

~$ unalias alias1 # skasowanie aliasu o nazwie alias1,
~$ unalias alias1 alias2 alias3 # skasowanie aliasów: alias1, alias2, alias3,
~$ unalias -a # skasowanie wszystkich!!! aliasów (nie tylko tych określonych w pliku .bash_aliases),

Pisałem już o negatywnych skutkach użycia niewłaściwych znaków w nazwie aliasu. Wróćmy np. do znaku * (gwiazdka) Próbując wykasować alias przypisany do tego znaku:

~$ unalias *

uzyskamy wynik co najmniej zaskakujący. By osiągnąć to co chcieliśmy musimy wywołać komendę w postaci:

~$ unalias \*

Lista aktywnych aliasówZawartość pliku .bash_aliases bywa ciekawaOczywiście komenda unalias -a usunie również alias przypisany do gwiazdki, ale... wraz ze wszystkimi pozostałymi aliasami. To chyba nie o taki efekt nam chodzi! ;)

Wspominałem już, że listę aktywnych aliasów otrzymamy wydając w oknie terminala komendę: alias. Jednak IMO warto też czasami sprawdzić co zawiera plik .bash_aliases.

Na widocznym z prawej listingu, uzyskanego po wykonaniu komendy: cat .bash_aliases widoczne są nie tylko definicje poszczególnych aliasów czy też przypisane do nich komentarze.

Według mnie dużo istotniejsze jest zwrócenie uwagi na fakt, że: aliasy możemy definiować przy pomocy wcześniej(!) zdefiniowanych aliasów. W przypadku prezentowanych listingów dotyczy to m.in. definicji komend alias (,a) czy sudo (,s).

Ale o tym dowiesz się jedynie wtedy gdy zajrzysz do pliku .bash_aliases.


Moje aliasy

Nieco wcześniej wskazałem ogólne zasady jaki winny być brane pod uwagę podczas tworzenia nazw aliasów.

Dla ułatwienia tym, którzy chcieliby skorzystać z "gotowca" poniżej prezentuję zawartość mojego pliku .bash_aliases.Poniższy listing zawiera zestaw (podstawowych, działających) aliasów, z których korzystam na codzień:

alias ,a="alias" # praktyczny alias aliasu! :D
,a ,aa="unalias -a" # usunięcie wszystkich (!) aktywnych aliasów,
,a ,au="unalias" # tymczasowe unieważnienie aliasu,
,a ,aa=",au -a" # tymczasowe usunięcie wszystkich (!) aliasów,
# ponowne wczytanie pliku .bashrc, co skutkuje również odnowieniem aliasów
,a ,bsh=". ~/.bashrc; ,; echo; echo Ponownie wczytano plik .bashrc; echo;"
# wywołanie edycji i przeładowanie pliku .bash_aliases z komunikatem,
,a ,bse="nano ~/.bash_aliases && ,bsh;"

,a ,="clear" # wyczyszczenie ekranu terminala,
,a ,e="exit" # wyjście,
,a ,ce=",; ,e" # wyczyszczenie ekranu terminala oraz wyjście,
,a ,m="mc" # uruchomienie MC,
,a ,n="nano" #uruchomienie nano,

,a ,0="cd ~" # powrót do katalogu domowego, równoważne cd $HOME
,a ,1="cd .." # w strukturze katalogów wejście 1 poziom wyżej,
,a ,2="cd ../.." # w strukturze katalogów wejście 2 poziomy wyżej,
,a ,3="cd ../../.." # w strukturze katalogów wejście 3 poziom wyżej,
,a ,-="cd -" # skok do katalogu domowego z podaniem ścieżki, równoważne: cd $HOME; pwd
,a ,l="ls -Alh --color=auto --group-directories-first"
,a ,ll="ls -alF --color=auto --group-directories-first"

,a ,cpu="lscpu" # podstawowe informacje o procesorze
,a ,blk="lsblk" # podstawowe informacje o strukturze urządzeń blokowych np. dysków
,a ,pci="lspci" # podstawowe informacje o yrządzeniach typu PCI
,a ,usb="lsusb" # podstawowe informacje o urządzeniach USB

,a ,s="sudo" # umożliwienie wykonanie komendy jako inny (najczęściej: root) użytkownik,
,a ,ss=",s su" # otwarcie sesji super usera z konta zwykłego użytkownika,
,a ,sS=",s -s" # tryb "wszechmocny"!
,a ,sapt=",s apt-get update; ,s apt-get -y upgrade; ,s apt-get -y dist-upgrade"
,a ,sapc=",s apt-get autoclean"
,a ,sapr=",s apt-get autoremove"
,a ,sk=",s poweroff" # wyłączenie RPi,
,a ,smc=",s mc" # uruchomienie MC w trybie super usera,
,a ,sn=",s nano" # uruchomienie nano w trybie super usera,
,a ,sps=",s ps -ax" #wyświetla listę procesów,
,a ,sr=",s reboot" # reboot systemu,
,a ,sv=",s vi" # uruchomienie vi w trybie super usera,
,a ,t="htop" # informacje o aktualnym obciążeniu systemu,

,a ,rpic=",s raspi-config" # uruchomienie narzędzie konfiguracyjne OS Raspbian,
,a ,reec=",s rpi-eeprom-config" # wyświetla aktualną konfigurację EEPROM,
,a ,reee=",s -E rpi-eeprom-config --edit" # edycja aktualnej konfiguracji EEPROM,
,a ,reeu=",s rpi-eeprom-update" #
# odczyt (co 1s): częstotliwości procesora, jego temperatury oraz napięcia zasilania,
,a ,rmon="watch -t -n1 '(vcgencmd measure_clock arm; vcgencmd measure_temp; vcgencmd measure_volts core)'"
# ustawianie środowiska dla Python 3.x
,a ,ve='python3 -m venv ./venv'
,a ,va='source ./venv/bin/activate'
# działanie związane z monitorem conky
,a ,co="conky" # uruchomienie,
,a ,ck="killall conky" # zamknięcie,
,a ,cm="conky-manager2" # uruchomienie programu Conky-Manager2 (trzeba zainstalować),
# kolorowy grep
,a ,g="grep --color"
,a ,gp="grep -P --color"
# działania w sieci:
,a ,cu="curl ipinfo.io" # jak mnie widzą?
,a ,ipt=",s iptraf-ng" # monitorowanie sieci,
,a ,net="ifconfig" # konfiguracja urządzeń sieciowych,
,a ,port="netstat -tulanp" # aktywne połączenia,
,a ,po="lsof -P -i -n" # otwarte porty,

Przecinek nie wadzi nikomu ;)Jak widać przyjąłem, że wszystkie moje aliasy zaczynają się od przecinka. Nie jest to dziełem przypadku. Zapobiega to mimowolnemu nadpisaniu aliasem np. jakiejś komendy powłoki.

Ponieważ taki alias zostanie wykonany w pierwszej kolejności ewentualne błędy... mocno popsują humor. Niniejszy artykuł dedykuję tym, którzy zaczynają przygodę z Raspbianem toteż wyjaśnie dlaczego przecinek a nie kropka.

Kropka w systemach ...x'owych ma bardzo istotne znaczenie. Nie tylko, że postawiona na pierwszym miejscu nazwy pliku czy katalogu wskazuje, że winny być ukryte. Czyli niewidoczne podczas zwykłego listowania zawartości katalogu.

Dodatkowo pojedyncza kropka (znak .) jest synonimem komenty source. Komenda source (jak również znak kropki) spowoduje odczyt i uruchomienie w bieżącej powłoce poleceń zawartych w pliku, którego nazwa jest argumentem komendy. Do znalezienia katalogu zawierającego plik wykorzystywana jest ścieżka zawarta w zmiennej $PATH, czyli szeroko!.

Toteż ewentualny błąd przypisania kropki do aliasu mógłby spowodować wiele kłopotu.

IMO wykorzystanie przecinka nie stwarza takiego zagrożenia. Mało tego wszystkie moje aliasy są jednoznacznie "oznaczone" przecinkiem na początku nazwy. Chciałbym zwrócić uwagę na dwa (zawarte w pliku) aliasy: ,bse oraz ,bsh.

Pierwszy z nich (,bse) jest to wywołanie edycji (edytor nano) pliku .bash_aliases. Po zakończeniu następuje wywolanie aliasu ,bsh skutkującego ponownym wczytaniem pliku .bashrc.

Jak już wskazywałem plik ten powoduje sprawdzenie obecności pliku definicji aliasów (.bash_aliases). Jeśli plik zostanie odnaleziony w katalogu domowym nastąpi jego wczytanie.

Może dziwić dlaczego wywoływana jest tu procedura wczytywania .bashrc, a nie .bash_aliases. Wynika to z faktu, że jeśli skasujesz wszystkie aliasy (komendą: unalias -a) to zostaną również usunięte aliasy "systemowe". By je odnowić niezbędne jest ponowne wczytanie ich definicji.

Zakończenie

Oczywiście definicje aliasów zawarte w moim pliku .bash_aliases nie wyczerpują potrzeb czy też możliwości definiowania własnych "komend" czy funkcji. Z doświadczenia wiem, że warto zwrócić uwagę na to, które z funkcji systemu wymagają naszej większej: uwagi, ingerencji czy zainteresowania. Aliasy zapewniają nam elastyczność i poszerzają pole manewru.

Ponieważ system operacyjny Raspbian należy dużej rodziny systemów linuksowych toteż opisane aliasy (w zasadzie) winny działać bez problemów w większości dystrybucji. Nie mogę jednak wykluczyć przypadków, gdy ich działanie będzie nieco odmienne od tego pod Raspbianem. 

Zagadnienia opisane w niniejszym artykule są pokłosiem doświadczeń związanych z realizacją projektu "Mikroskop do lutowania (RPi 4B+HQC+M42)".

Jeśli jesteś zainteresowany tym na co "marnotrawię swój czas" zapraszam do Warsztatu krótkofalowca.