Portál AbcLinuxu, 11. května 2025 10:24
Řešení dotazu:
konzole != shell
man bash, který v závislosti na instalaci a distribuci by případně mohl býti i v češtině.
Bash je jednou z mnoha implementací shellu definovaného standardem, která ale přidává obrovskou spoustu funkcí navíc. Rozdíl je tedy ten, že v Bashi se dá spousta věcí napsat úsporněji a jednodušeji než ve standardním shellu. Pravděpodobně nejblíž implementaci původního standardu je Dash.
Ještě před několika lety se mělo všeobecně za to, že skripty v distribucích by se měly omezovat pouze na standardizovaný shell bez rozšíření typu Bash, aby příznivci a odpůrci Bashe mohli mírumilovně koexistovat. Poslední dobou se ale takové orthodoxní postoje příliš nevidí a spousta skriptů přímo závisí na Bashi.
Bash má například pole, která výrazně usnadňují některé situace, a k tomu obrovskou spoustu expanzí proměnných, které standardní shell nepodporuje:
soubory=('první' 'druhý' 'třetí') echo "${soubory[@]/%/.přípona}"
Dash něco podobného dokáže (zdánlivě) taky, ale problém nastane, pokud například některé jméno souboru bude obsahovat mezeru. Bez mezer (a s totožným výstupem) to půjde třeba takto.
soubory='první druhý třetí' echo $(for soubor in $soubory; do echo "${soubor}.přípona"; done;)
Další zajímavost Bashe je (kromě polí) taky aritmetika a datové typy. Proměnné deklarované jako integer podporují jednoduché přiřazení a použití ve výrazech. Bohužel Bash podporuje jen bezznaménková celá čísla, ale něco se v něm tu a tam spočítat dá. To následující je funkce, která vyhodnocuje polynomy:
# Příklad: 4x^2 + 2x + 3 [x = 7]: polynomial 4 2 3 7 polynomial() { local -ar args=("$@") local -air coefficients=("${args[@]:0:${#args[@]} - 1}") local -ir variable="${args[-1]}" local -i value=0 local -i power=1 for ((index = 1; index <= ${#coefficients[@]}; ++index)); do value+='power * coefficients[-index]' ((power *= variable)) done echo "$value" }
A tady je 53 + 2×52 + 3×5 + 4:
$ polynomial 1 2 3 4 5 194
Tohle^^^ by Dash dokázal jistě taky, v potu tváře a za použití expr
, ale asi bych to v něm nechtěl kódit. Bash je tedy trochu univerzálnější než standardní shell; dokáže zastat několik málo běžných funkcí, kvůli kterým by bylo jinak potřebné sáhnout k perl
u, sed
u nebo awk
.
nmap -n -iR 100 -T5 -p 80 -oG -|grep open|tr -d 'Host:( '|cut -d ')' -f 1Data z nmap se neobjeví na obrazovce, ale půjdou na vstup programu grep, pak tr a výstupem bude výstup cut. Téměř pokaždé, když někdo píše shell, myslí bash či něco kompatibilního.
/usr/bin
je více, ale přesto ze systému mi v něm sídle skoro skriptů pro bash.
#!/bin/sh
a pak se diví, že mu to nefunguje.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.