První vychytávkou, kterou si dnes ukážeme, je jednoduchý skript na oboustranný tisk:
Soubor print2p:
#!/bin/bash FILE=${1?"První argument musí být název PostScriptového souboru!"} MAGN=${2:-1} echo "Tisknu liché stránky..." mpage -$MAGN -o -bA4 -r -j 1%2 "$FILE" | lpr echo -n "Vložte vytištěné stránky zpět do " echo "tiskového zásobníku a stiskněte ENTER." read echo "Tisknu sudé stránky..." mpage -2 -o -bA4 -j 2%2 "$FILE" | lpr
Skript je určen hlavně pro uživatele, kteří tiskárnu používají sami. Pokud tisknete na nějaké vzdálené mašince, musíte nějak zajistit, aby se mezitím nepokusil tisknout ještě někdo jiný…
Uvedený prográmek očekává dva argumenty: název tištěného souboru a nepovinně také poměr zmenšení. Tak například volání:
print2p soubor.ps
vytiskne soubor soubor.ps tak, že nejprve pošle na tiskárnu jenom liché stránky (odzadu), vyzve uživatele, aby vytištěnou část vložil zpět do tiskového zásobníku, a po stisku Enteru dotiskne odpovídající sudé stránky (od začátku). Takto nakonec dostaneme celý dokument soubor.ps vytištěný pěkně oboustranně.
Zadáme-li
print2p soubor.ps 4
vytisknou se čtyři stránky dokumentu na jednu fyzickou stranu papíru – ovšem rovněž oboustranně. Další možné volby pro druhý argument jsou 1, 2 nebo 8.
Jak jste si jistě všimli, jádrem skriptu je program mpage, který se vlastně stará o všechno. Jeho parametry –1, –2, –4 nebo –8 určují, kolik stran dokumentu se má vytisknout na jednu fyzickou stranu papíru. Pomocí -b se volí výstupní formát papíru (v našem případě A4), -o říká, že nechceme kolem stránek žádné orámování, a -j definuje výběr stran, které se budou tisknout (sudé, nebo liché). Zapomněl jsem ještě na parametr -r, jenž programu mpage přikazuje, aby stránky tisknul v opačném pořadí (od poslední k první).
mpage akceptuje i další volby. Doporučuji vám prostudovat si příslušné manuálové stránky (man mpage).
Konverze manuálových stránek
Možná jste někdy potřebovali zkonvertovat rozličné manuálové stránky do PostScriptu či HTML. Umí to utilitka groff:
groff -mandoc -Tps bash.1 > bash.ps groff -mandoc -Thtml bash.1 > bash.html
První příkaz zkonvertuje manuálovou stránku bashe do PostScriptu a druhý na HTML stránku…
which & file
Sám na sobě jsem vypozoroval, že když pomocí which zjišťuji, kde se nachází nějaký spustitelný soubor, obvykle potom následuje příkaz file zkoumající, co že je ten soubor zač (jestli kompilovaný program nebo nějaký čitelný skriptík). Mnoho zbytečných úhozů na klávesnici mi pak ušetří následující banalita, kterou jsem si nazval whfile:
#!/bin/bash C=${1?"První argument musí být název programu!"} X=`which "$C"` && file -b "$X" && ls -la "$X"
Tak například volání:
whfile bash
dá na výstup podrobné informace o interpretu bashe:
/bin/bash ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped -rwxr-xr-x 1 root root 512540 srp 22 2000 /bin/bash
Rozdělování souboru na menší kousky
Ti z vás, kteří jste občas nuceni přenášet kvanta dat mezi počítači na disketách, jste jistě narazili na problém, jak na tato archaická média dostat soubor, který má třeba 10 mega bajtů. Pokud vím, ani gzip ani tar rozkládat archiv na více menších částí neumí. K tomuto účelu byl pány Granlundem a Stallmanem vytvořen příkaz split:
split <VOLBA> [<VSTUP> [<PREFIX>]]
Například příkaz, který následuje, rozdělí soubor archiv.tgz na několik částí o velikosti 100 KB:
split -b 100k "archiv.tgz" "archiv.tgz."
Výsledné souborky se budou jmenovat podle zadaného prefixu archiv.tgz.aa, archiv.tgz.ab, archiv.tgz.ac a tak dále.
Možná se vám bude hodit tento malý skriptík, který z adresáře zadaného jako jediný parametr vytvoří zagzipovaný tarovský archiv stejného jména, a ten podle potřeby rozdělí na menší části tak, aby se vešly na diskety:
Soubor pak:
#!/bin/bash NAME=${1?"První argument musí být jméno pakovaného adresáře!"} SIZE="1400k" # DOS-formátované (-23 kB na vadné sektory) if [ -d "$NAME" ]; then ARCHIVE=`basename "$NAME"` tar -cvz "$NAME" | split -b "$SIZE" - "${ARCHIVE}.tgz." fi
Spojení souborů do původního archivu by měl zajistit příkaz:
cat archiv.tgz.* > archiv.tgz
Další věcí, která mě asi nejvíce irituje, je kopírování těchto souborů na diskety. Při ručním přesouvání to je samé mount a umount, však to znáte. Kdysi v minulých dílech jsme řešili kopírování z disket a dnes vám ukážu jeden ze způsobů, jak jít opačnou cestou – tedy automatizovaně dostat soubory na diskety:
#!/bin/bash FLOPPY=/mnt/floppy while [ "$1" != "" ]; do echo "Vložte prosím disketu a stiskněte ENTER (CTRL+C=přerušit)" read mount "$FLOPPY" mv -iv "$1" "$FLOPPY" umount "$FLOPPY" shift done
Uvedený skript je velice jednoduchý. Hodí se takřka jen na výstupy nějakého splitu. Každý soubor, který zadáte jako parametr, přesune na novou disketu. Bylo by hezké jej udělat tak, aby si kontroloval velikosti kopírovaných souborů a ukládal na diskety trochu inteligentněji. Já jsem ale příliš sexy, abych se tím zabýval. :-)
Tímto prográmkem se také pro dnešek rozloučíme. Doufám, že jste v mých prostinkých výtvorech nalezli něco zajímavého, nebo že vás alespoň trochu inspirovaly.