Boole-algebra és shell script

Az és, a vagy és a negáció műveletei igen fontosak. Nézzünk egy egyszerű példát.

[ "$#" -ne 2 ] && { echo "Nem megfelelő argumentumszám"; exit; }

Hogy ez hogyan működik egy képzeletbeli script elején? Az && és kapcsolatot fejez ki. Tehát ha nem 2 argumentumot kap a script, akkor kíír egy üzenetet és kilép a programocskból. 🙂 Hogyan lehet ezt megfordítani?

[ "$#" -eq 2 ] || { echo "Nem megfelelő argumentumszám"; exit; }

Az eredmény ugyanaz. A || vagy kapcsolatot fejez ki. Vagy egyenlő 2-vel az argumentum szám, vagy kilép a programból. Az első script részlet algebrailag (A != B) és (igaz), a második (A == B) vagy (igaz).

Az egyik legfontosabb szabály, hogy a nem-és felcserélhető igen-vagy-ra. 🙂

További részletek a Boole-algebráról az alábbi linkeken.

https://hu.wikipedia.org/wiki/Boole-algebra_(informatika)

https://hu.wikipedia.org/wiki/Boole-algebra

Sorvége jel Linux, Mac és Windows alatt, folyamat kezelés parancssorból

Az ún. szövegfile-ok feldolgozása soronként történik. A sorvége karakterek a CR – carriage return, escape szekvenciája \r, (decimális kódja 13, hexadecimálisan pedig 0D, jelölik még ^M, azaz CTRL+M-ként is, “CTRL+V CTRL+M”-ként lehet “előhozni”), illetve az LF – line feed, azaz shell scriptben vagy c-ben jelölve \n (decimális kódja 10, hexadecimálisan pedig 0A).

Linux alatt – illetve OS X alatt is – ez “\n”, klasszikus Mac alatt “\r”, Windows alatt pedig “\r\n”. Látható tehát, hogy teljes káosz. 🙂

https://en.wikipedia.org/wiki/Newline

Nézzünk meg néhány hasznos billentyűzet kódot Linux/UNIX alatt, illetve a folyamat kezelés ide vonatkozó részeit!

CTRL+C: SIGINT, megszakítás, azaz interrupt, vagyis “kill
CTRL+Z
: SIGTSTP, az előtérben futó processz megszakítása, szoktak utána “bg <ENTER>“-t beírni, így a processz háttérben (background) tovább fut, jobs parancs-csal lehet kiírni a futó processzeket, illetve fg (foreground) paranccsal újra “előtérbe hozni” – eleve “háttérben” a sor végi “&” jellel lehet indítani egy folyamatot/processzt
CTRL+D: file vége, úgyis mint exit parancs a shellben, pl. bash-ban

CTRL+L: képernyőtörlés – ugyanaz, mint a “clear” parancs
CTRL+S
: leállítja a képernyőre/terminálba küldött “kimenetet”
CTRL+Q: a CTRL+S-sel leállított kimenetet “folytatja”

https://www.howtogeek.com/howto/ubuntu/keyboard-shortcuts-for-bash-command-shell-for-ubuntu-debian-suse-redhat-linux-etc/

https://www.thegeekdiary.com/understanding-the-job-control-commands-in-linux-bg-fg-and-ctrlz/

Linux parancsok II. – és a pipeline

Linux illetve UNIX-ok alatt van egy nagyon izgalmas eszköz a fejlesztő vagy rendszergazda kezében. Ez a “|” pipe jel. 🙂

https://www.guru99.com/linux-pipe-grep.html

A “|” pipe jel segítségével az egyik parancs kimenetét a következő parancs bemenetére köthetjük, így létrehozva egy pipeline-t, azaz egy csővezetéket. Értsd: egy parancs STDOUT-ját a következő parancs STDIN-jére lehet kötni. Természetesen több tagon keresztül lehet “vezetni” az adatfolyamot.

Nézzük meg a Linux/UNIX világ két legkedveltebb pager-ét, a more-t és a less-t.

gvamosi@gergo1:~$ ls -lR / | more

gvamosi@gergo1:~$ ls -lR / | less

A közös bennük, hogy az ls -lR miatt várhatóan jó hosszú listába engednek betekintést nyújtani, hiszen erre vannak kitalálva. A more csak előre “lép”, és minden UNIX rendszeren telepítve van, a less oda-vissza hagyja magát scrollozni, és implementációfüggő. 🙂

Bonyolítsuk meg a grep, azaz az egrep (reguláris kifejezések megengedettek, leírása később) funkcióval, és a hiba STDERR kimenetet irányítsuk át a null device-ba, azaz a “semmibe”.

gvamosi@gergo1:~$ ls -lR / 2> /dev/null | egrep "/home/gvamosi:$"
/home/gvamosi:

Ez a parancs egyszer ki fogja írni a “/home/gvamosi:” sztringet, mivel a gvamosi felhasználó által bebarangolható könyvtárak és fájlok között a saját home könyvtára egyszer szerepel. A grep parancs egyébként sor szinten keres szövegben adott mintát (szöveg vagy reguláris kifejezés). 🙂

Hogy miért írok a parancssori csővezetékről, azaz a pipeline-ról? A válasz abban rejlik, hogy ez mindenhol visszaköszön az infotudományban. Akár a TCP/IP adatátviteli protokoll stack, tehát az internetet felépítő protokollstruktúra – hiszen tekinthetjük a hálózatot csővezetéknek, akár egy modern és friss terminológia, a “Pipeline as Code” Jenkins alatt. 🙂

https://hu.wikipedia.org/wiki/TCP/IP

https://jenkins.io/doc/book/pipeline-as-code/

Manual pages, man pages, man lapok, használati útmutatók – rendszergazdáknak és programozóknak

Hogyan kaphatunk a parancsokról még több leírást, a --help opción felül? Erre valók az ún. manual pages, man pages – azaz a man lapok vagyis a használati útmutatók.

gvamosi@gergo1:~$ man ls

A fenti paranccsal az ls parancs használati útmutatóját, man lapjait kérhetjük le.

A man lapok szekciókba vannak sorolva. Pl. a 3-as szekcióból így kérhetjük le a printf c függvényt.

gvamosi@gergo1:~$ man 3 printf

Ezzel a lekérdezéssel máris a Linux Programmer’s Manual-ban, vagyis a Linux Programozók Kézikönyvében vagyunk. Egy kizárólagosan ebben a kézikönyvben meglévő c függvényt, pl. a getc-t, simán a man getc paranccsal is lekérdezhetjük.

gvamosi@gergo1:~$ man printf

Ez a parancs eközben a printf-et mint Linux parancsot adja vissza. Ezzel egyenértékű a

gvamosi@gergo1:~$ man 1 printf

parancs, ami alapértelmezett a printf esetében, mivel benne van az egyes szekcióban, azaz a User Commands – Felhasználói Parancsok között is. 🙂

A .bash_profile file a home könyvtárban és az alias-ok

Tartozom tegnapról egy magyarázattal. Volt ugye bár ez a parancs:

gvamosi@gergo1:/dev$ l tty3

Ez nem más, mint egy alias bejegyzés a home könyvtárban található .bash_profile-ból. Hogy mi ez a file? Amennyiben – egyébként szinte mindig – bash van beállítva a /etc/passwd file-ban login shell-nek – magyarázat egy későbbi postban 🙂 -, úgy az ebben a file-ban található parancsok belépéskor végre lesznek hajtva. No ide teszem vagy 20 éve a kedvenc alias-aimat. 🙂

gvamosi@gergo1:~$ cat .bash_profile

# added by gvamosi on 20170830
export PATH=$PATH:.
# added by gvamosi on 20170828
alias ls="ls --color"
alias l="ls -l"
alias la="ls -la"

Egyrészt beállítom keresési útvonalnak az aktuális könyvtárat az export paranccsal – ezek a tab billenyűvel elérhetőek, és az első pár karatkter begépelése jól jöhet 🙂 -, másrészt a kedvenc alias-aimat hozzáadom a shell-emhez. Ezek a színes file lista, és az l és la parancsok.

Még egy érdekesség a mai bejegyzés végére: a cd paranccsal – paraméter nélkül – a home könyvtárunkba kerülünk. 🙂

BASH programozás – script-ek

Beköszönés szintjén találtam egy rövidke ismertetőt a linux rendszerek parancssori programozásához. 🙂

http://web.cs.elte.hu/linfo/Shell/script.html

Az egyik script-et ki is próbáltam. Tényleg működik.

#!/bin/sh
for i in *.txt 
do
 if grep font $i > /dev/null
 then 
 mv $i ..
 fi
done

Hogy mit jelent az első sorban a /bin/sh? Kideríthetjük!

gvamosi@gergo1:~$ file /bin/sh
/bin/sh: symbolic link to dash
gvamosi@gergo1:~$ file /bin/dash
/bin/dash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=486323dd0fe3ec5af388e4ea4217a1f0092961d2, stripped
gvamosi@gergo1:~$ file /bin/bash
/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=ffe165dc81a64aea2b05beda07aeda8ad71f1e7c, stripped
gvamosi@gergo1:~$ ls -l /bin/dash
-rwxr-xr-x 1 root root 121464 Jan 17 2019 /bin/dash
gvamosi@gergo1:~$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1168776 Apr 18 06:12 /bin/bash

És hogy mit csinál a szkript? Megnézi a .txt kiterjestésű file-okat, hogy van-e bennük “font” sztring, és ekkor mozgatja őket a szülő “..” könyvtárba. 🙂