Portál AbcLinuxu, 15. května 2024 16:10

BASH - II

30. 10. 2003 | Jan Fuchs
Články - BASH - II  

V dnešní části seriálu si ukážeme základní příkazy. Vysvětlíme pojmy roura a přesměrování a na závěr to zkombinujeme a ukážeme si praktický příklad.

Obsah jednotlivých dílů

  1. Úvod, editace příkazové řádky
  2. Základní příkazy, roury a přesměrování
  3. Proměnné, podmínky a cykly
  4. Funkce a příkazy
  5. Dokumenty here, regulární výrazy
  6. Ladění skriptů, odchytávání signálů a příklady

Základní příkazy, roury a přesměrování

Popis příkazů nebudu rozebírat do podrobností, od toho máme manuálové stránky. Jen stručně nastíním k čemu jednotlivé příkazy slouží. Abyste věděli, pod kterým příkazem se skrývá vámi požadovaná činnost, a měli jste se na začátku čeho chytit.

Základní příkazy

Příklad použití archivačního programu tar (je to standardní nástroj, takže ho naleznete snad v každé distribuci).

$ tar zcvf archiv.tgz ./adresar
./adresar/
./adresar/obesenec.sh
./adresar/oggwavmp3.sh
./adresar/archmed.sh
$ tar zxf archiv.tgz
$ tar jcf archiv.tar.bz2 ./adresar
$ tar jxf archiv.tar.bz2

Mimo archivace tar použije i kompresi z - gzip, j - bzip2. Volba x - rozbalí archív, c - vytvoří archív, v - vypisuje informace.

Roury

Příkazy dostávájí opravdovou moc teprve díky rourám a přesměrováním. Roura (značí se pomocí operátoru |) připojuje výstup jednoho procesu na vstup druhého procesu.

Přesměrování

Operátory přesměrování.

Chcete-li zabránit přepsání souboru při přesměrování, můžete toto implicitní nastavení změnit následujícím příkazem.

$ set -o noclobber

Před operátorem přesměrování můžeme použít deskriptor souboru.

Dvě ukázky přesměrovaní standardního výstupu a standardního chybového výstupu do stejného souboru. Jako soubor použijeme /dev/null (o všechno, co do tohoto speciálního souboru přesměrujeme, přijdeme). Zkuste si příklad upravit tak, aby se vám na obrazovku vypisoval jen standardní chybový výstup a pak jen standardní výstup. Před zkoušením si nastavte jako aktuální adresář nějaký, který obsahuje podadresáře a soubory.

$ find | xargs cat &> /dev/null
$ find | xargs cat > /dev/null 2>&1

První příklad použití programu tar by šel zapsat i následujícím způsobem za použití roury a přesměrování do souboru.

$ tar cv ./adresar/ | gzip > archiv.tgz
./adresar/
./adresar/obesenec.sh
./adresar/oggwavmp3.sh
./adresar/archmed.sh

Praktický příklad

Potřebujeme vytvořit kontrolní součet všech souborů v aktuálním adresáři a jeho podadresářích za pomocí md5sum a uložit do souboru md5sum.txt (u tohoho souboru nebudeme provádět kontrolní součet).

Ukáži vám dvě řešení. To druhé jsem vytvořil, než jsem se v konferenci dozvěděl o příkazu xargs.

$ find . \! -path './md5sum.txt' -type f | xargs -i md5sum {} > md5sum.txt

Program find předá programu xargs cestu ke všem souborům (na každém řádku je cesta k jednomu souboru), ten vezme řádek, dá ho do uvozovek a předá jako argument programu md5sum, načte další řádek... Dokud nezpracuje celý vstup. Standardní výstup programu md5sum se přesměruje do souboru md5sum.txt.

find

xargs

Je zbytečné psát takhle dlouhý příkaz, když ho budeme často používat. Proto si do souboru ~/.bashrc přídáme alias.

alias md5sumr='find . \! -path './md5sum.txt' -type f | xargs -i md5sum {} > md5sum.txt'

Po dalším spustění BASHE stačí, když zadáte jen md5sumr.

Druhé řešení je vytvoření skriptu md5sumr.sh. Je to jen pro ukázku, aby bylo vidět, že to jde udělat i mnohem složitějším způsobem.

#!/bin/bash

koren=$(pwd)
vystup="md5sum.txt"
cesta="./"

Md5sum() {
  local tmp

  for soubor in *; do
    if [ "$soubor" == "*" ]; then
      break
    fi

    if [ -d "$soubor" ]; then
      cd "./$soubor"
      tmp="$cesta"
      cesta="$cesta$soubor/"
      Md5sum
      cd "../"
      cesta="$tmp"
    else
      if [ "$soubor" != "$vystup" ] || [ "$cesta" != "./" ]; then
	pwd=$(pwd)
	cd "$koren"
	md5sum "$cesta$soubor" >> "./$vystup"
	cd "$pwd"
      fi
    fi
  done
}

Md5sum

Na příště si připravte svůj oblíbený editor. Jestli žádný takový ještě nemáte, určitě vyzkoušejte Emacs a vi a jeden z nich si vyberte, časem určitě oceníte jejich kvality. Výše uvedený kód jsem úmyslně nekomentoval. Až dočtete tento seriál, měli byste ho pochopit.

Seriál BASH (dílů: 6)

První díl: BASH - I, poslední díl: BASH - VI.
Předchozí díl: BASH - I
Následující díl: BASH - III

Související články

BASH - I
BASH - III
BASH - IV
BASH - V
BASH - VI

Odkazy a zdroje

BASH - GNU Project

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.