Po přečtení odpovědi ilkkachu na tuto otázku jsem se dozvěděl o existenci declare
(s argumentem -n
) vestavěný shell.
help declare
přináší:
Nastavit hodnoty a atributy proměnných.
Deklarovat proměnné a dát jim atributy. Pokud nejsou uvedeny žádné JMÉNA, zobrazte atributy a hodnoty všech proměnných.
-n … učinit z NAME odkaz na proměnnou pojmenovanou podle její hodnoty
I požádat o obecné vysvětlení pomocí příkladu týkajícího se declare
, protože nerozumím man
. Vím, co je proměnná a rozšiřuji ji, ale stále mi chybí man
na declare
(atribut proměnné?).
Možná byste to chtěli vysvětlit na základě kódu ilkkachu v odpovědi:
#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi }
Komentáře
- Související: unix.stackexchange.com/questions/522366/…
Odpověď
Ve většině případů to stačí s implicitní deklarací v bash
asdf="some text"
Někdy však chcete, aby hodnota proměnné byla pouze celé číslo (takže v případě, že by se později změnila, i automaticky, mohla by být změněna pouze na celé číslo, v některých případech výchozí), a lze použít:
declare -i num
nebo
declare -i num=15
Někdy chcete pole a pak potřebujete declare
declare -a asdf # indexed type
nebo
Dobré výukové programy o polích najdete v bash
při procházení internetu pomocí vyhledávacího řetězce“ bash array tutorial „(bez uvozovek), pro příklad
linuxconfig.org/how-to-use-arrays-in-bash-script
Myslím, že toto jsou nejčastější případy, kdy deklarujete proměnné.
Všimněte si také, že
- ve funkci,
declare
učiní proměnnou lokální (ve funkci) -
bez jakéhokoli názvu, vypíše všechny proměnné (v aktivním prostředí)
declare
Nakonec získáte stručné shrnutí funkcí integrovaného příkazu prostředí declare
v bash
s příkazem
help declare
Komentáře
- Dobrý den z OP! Myslím, že vaše odpověď je skvělá, hlasoval jsem pro ni a děkuji vám za tuto, dle mého názoru, velmi didaktickou odpověď. Právě jsem navrhl menší editaci, která podle mého skromného názoru umožní ještě snadnější a přístupnější čtení pro nováčky; projděte prosím tento návrh.
- Právě jsem viděl, že
user:muru
hlasoval pro odmítnutí úpravy; Mějte prosím na paměti, že já a muru jsme “ několikrát střetli “ v různých částech tohoto webu a předpokládám, že jeho odmítnutí není ‚ t cíle a je ve skutečnosti škodlivý na rozdíl od přímých změn uvedených na stránce s návrhy úprav zde: unix.stackexchange.com/review/suggested -edits / 325749 - @JohnDoea, viděl jsem, že vaše úpravy odmítl i jiný uživatel. Myslím, že některé vaše úpravy jsou dobré, ale některé z nich změní poselství oproti tomu, co jsem zamýšlel, takže bych je neměl rád. Mohu upravit odpověď tak, aby obsahovala i to, co považuji za dobré úpravy.
- děkuji; jak pravděpodobně víte, odmítání úprav je v SE mnohem častější než jejich přijímání (i částečné); děkuji, že jste mi dali vědět, že jiný uživatel úpravu odmítl (neviděl jsem to ‚ upřímně) a že jste zvážil vložení alespoň některých svých úprav do vaší odpovědi; Velmi to respektuji,
Odpověď
Výstup help declare
je docela strohý. Jasnější vysvětlení lze najít v man bash
nebo info bash
– druhé je zdrojem toho, co následuje.
Nejprve několik definic. O proměnných a atributech :
parametr je entita, která ukládá hodnoty. … proměnná je parametr označený
name
. Proměnná má hodnotu a nula nebo více atributů . Atributy jsou přiřazovány pomocí integrovaného příkazudeclare
…
A o declare
integrovaném :
declare
declare [-aAfFgilnrtux] [-p] [name[=value] …]
Deklarovat proměnné a dát jim atributy. Pokud nejsou uvedeny žádné názvy, zobrazte místo nich hodnoty proměnných.
…
-n
Každému dejte name the nameref attribute, což je název odkaz na jinou proměnnou. Tato další proměnná je definována hodnotou name . Všechny odkazy, přiřazení a úpravy atributů name , s výjimkou těch, které používají nebo mění samotný atribut-n
, se provádějí na proměnné, na kterou odkazuje hodnota názvu . …
Upozorňujeme, že proměnné reference na název jsou k dispozici pouze v Bash 4.3 nebo novějším 1 .
Také pro užitečný úvod do declare
a proměnných atributů v Bashi vás odkazuji na toto odpovězte na “ Co dělají declare name
a declare -g
? “ (který se však zaměřuje hlavně na rozsah proměnných).
V zásadě 2 , declare name=[value]
je ekvivalentní přiřazení name=[value]
, které pravděpodobně znáte. V obou případech je name
přiřazena hodnota null hodnota, pokud value
chybí.
Upozorňujeme, že mírně odlišný declare name
místo toho nenastaví proměnná name
3 :
$ declare name ## With the -p option, declare is used to display ## attributes and values of variables $ declare -p name declare -- name ## "name" exists ## Parameter expansion can be used to reveal if a variable is set: ## "isunset" is substituted to "name" only if unset $ echo "${name-isunset}" isunset
Proměnná name
tedy může být:
- deklarována a unset , po
declare name
; - deklarováno a nastaveno pomocí null jako hodnotu, po
name=
nebodeclare name=
; - deklarovaném , set a s nenulovou hodnotou po
name=value
nebo .
Obecněji declare [options] name=value
- vytvoří proměnnou
name
– což je parametr s názvem, který je zase jen část paměti, kterou můžete použít k ukládání informací 4 ; - přiřadí hodnota
value
k tomu; - volitelně nastaví atributy
name
„, které definují jak druh hodnoty, může ukládat (ne ve smyslu typu , přesně řečeno, protože Bashův jazyk není napsán) a způsoby, jak s ním lze manipulovat.
Atributy jsou pravděpodobně jednodušší vysvětlit na příkladu: použití declare -i name
nastaví atribut “ celé číslo “ z name
, necháme to považovat za celé číslo; citováním manuálu bude provedeno “ aritmetické vyhodnocení, když je proměnné přiřazena hodnota „:
## Let"s compare an ordinary variable with an integer $ declare var $ declare -i int $ var="1+1" $ int="1+1" $ echo "$var" 1+1 ## The literal "1+1" $ echo "$int" 2 ## The result of the evaluation of 1+1
Ve světle výše se v kódu ilkkachu děje to, že:
-
Je deklarována proměnná s názvem
ref
s “ nameref “ sada atributů a obsah$1
(první poziční argument) je přiřazen it:declare -n ref="$1"
Cíl referenční proměnné názvu, například
ref
je držet název jiné proměnné, která by obecně nebyla známa předem, možná proto, že chceme, aby byla dynamicky definována (např. Protože chceme znovu použít část kódu a mít ji aplikován na několik proměnných) a na poskytují pohodlný způsob, jak na něj odkazovat (a manipulovat s ním). (Není však jediný: indirection je alternativa; viz Rozšíření parametrů shellu ). -
Kdy hodnota proměnné
tmp1
je přiřazenaref
:ref=$tmp1
je implicitně deklarována další proměnná, jejíž název je hodnotou
ref
. Hodnotatmp1
je také nepřímo přiřazena implicitně deklarované proměnné pomocí tohoto explicitního přiřazení kref
.
V rámci vaší propojené otázky volání read_and_verify
as
read_and_verify domain "Prompt text here..."
deklaruje proměnnou domain
a přiřaďte mu hodnotu tmp1
(tj. vstup uživatele). Je přesně navržen tak, aby znovu použil kód, který s uživatelem interaguje, a využil proměnnou nameref deklarovat domain
a několik dalších proměnných.
Abychom se podrobněji podívali na implicitní část, můžeme postup krok za krokem reprodukovat:
## Assign a value to the first positional argument $ set -- "domain" ## Declare the same "tmp1" variable as in your code $ tmp1="value for domain" ## Declare a "ref" variable with the nameref attribute set and ## assign the value "domain" to it $ declare -n ref="$1" ## Note that there is no "domain" variable yet $ declare -p domain bash: declare: domain: not found ## Assign a value to "ref" and, indirectly, to the "domain" variable ## that is implicitly declared $ ref=$tmp1 ## Verify that a variable named "domain" now exists, and that ## its value is that of "tmp1" $ declare -p domain declare -- domain="value for domain" ## Verify that "ref" is actually a reference to "domain" $ domain="new value" $ echo "$domain" new value $ declare -p ref declare -n ref="domain" $ echo "$ref" new value
1 Odkaz: ZMĚNY soubor, sekce “ 3. Nové funkce v Bash „, bod “ w „.
Může to být relevantní: například CentOS Linux 7.6 (aktuálně nejnovější verze) je dodáván s Bash 4.2 .
2 Jako obvykle u shell builtins, vyčerpávající a stručné vysvětlení je nepolapitelné, protože provádějí různé, možná heterogenní akce. Zaměřím se pouze na deklaraci, přiřazení a nastavení atributů a seznam, stanovení rozsahu a odebrání atributů budu považovat za mimo rozsah této odpovědi.
3 Toto chování declare -p
bylo zavedeno v Bash 4.4. Odkaz: Soubor CHANGES , část “ 3. Nové funkce v Bash „, bod “ f „.
Jako G-Man zdůraznil v komentářích, v Bash 4.3 declare name; declare -p name
přináší chybu. Stále však můžete zkontrolovat, zda name
existuje s declare -p | grep "declare -- name"
.
4 FullBashGuide, Parametry na mywiki.wooledge.org
Komentáře
Odpověď
Pokusím se to vysvětlit a pokusím se to vysvětlit, ale odpusť mi, pokud nebudu následovat příklad, který jsi uvedl. Raději se vás pokusím vést svým vlastním, odlišným přístupem.
Říkáte, že už rozumíte konceptům jako „proměnné“ a „jejich rozšiřování“ atd., Takže některé z nich jen prozkoumám základní znalosti, které by jinak vyžadovaly hlubší zaměření.
Začnu tedy tím, že základní level, příkaz declare
je jen způsob, jak říct Bashovi, že potřebujete proměnnou hodnotu (tj. hodnotu, která se může během provádění skriptu změnit) a že budete odkazujte na tuto hodnotu pomocí konkrétního názvu, přesně podle názvu, který uvedete vedle samotného příkazu declare
.
To znamená:
declare foo="bar"
řekne Bashovi, že chcete, aby proměnná s názvem foo
měla hodnotu bar
.
Ale … počkejte minutu … můžeme udělejte to bez použití declare
, nemůžeme. Stejně jako v:
foo="bar"
Velmi pravdivé.
No , stává se, že výše uvedené jednoduché přiřazení je ve skutečnosti implicitním způsobem pro .. ve skutečnosti .. deklaraci proměnné.
( Stává se také, že výše uvedené je jedním z několika způsobů změňte hodnotu proměnné s názvem foo
; je to přesně ta nejpřímější, výstižný, evidentní, přímočarý způsob .. ale není to jediný .. .. k tomu se vrátím později .. ).
Ale pak, pokud je to tak je možné deklarovat „název, který bude označovat proměnné hodnoty“ (z důvodu stručnosti dále jen „proměnná“) bez použití declare
, proč byste někdy chtěli použít tento pompézní příkaz „declare“?
Odpověď spočívá ve skutečnosti, že výše uvedené znamená Způsob, jak deklarovat proměnnou (foo="bar"
), to .. implicitně .. přiměje Bash uvažovat o tom, že proměnná je typu, který se nejčastěji používá v typickém scénáři použití pro shell .
Takový typ je typ řetězce, tj. posloupnost znaků bez zvláštního významu. Řetězec je tedy to, co získáte, když použijete implicitní deklaraci.
Ale vy, jako programátor, musíte někdy spíše uvažovat o proměnné jako např. O čísle .. na kterém musíte dělat aritmetiku operace .. a použití implicitní deklarace jako foo=5+6
nebude způsobí, že Bash přiřadí hodnotu 11 foo
jako můžete očekávat. Spíše přiřadí foo
sekvenci tří znaků 5
+
6
.
Takže .. potřebujete způsob, jak říct Bashovi, že chcete, aby foo
byl považován za číslo, ne za řetězec .. a k tomu se hodí explicitní declare
.
Stačí říct:
declare -i foo=5+6 # <<- note the "-i" option: it means "integer"
a Bash s radostí provede matematiku za vás a proměnné iv id = „přiřadí číselnou hodnotu 11 085c82de67 „>
.
To znamená: vyslovením declare -i foo
dáte proměnné foo
atribut toho, že je celé číslo.
Deklarace čísel (přesně celá čísla, protože Bash stále nerozumí desetinným místům, plovoucím čárkám atd.) může být prvním důvodem pro použití declare
, ale není to jediný důvod. Jak jste již pochopili, proměnným můžete dát několik dalších atributů. Například můžete mít Bash, aby hodnotu proměnné vždy nastavil na velká písmena bez ohledu na to: pokud řeknete declare -u foo
, pak od té doby, když řeknete foo=bar
Bash ve skutečnosti přiřadí řetězec BAR
proměnné foo
.
Aby bylo možné dát některý z těchto atributů k proměnné musíte použít příkaz declare
, není jiná možnost.
Nyní ještě jedna z atributy, které můžete zadat prostřednictvím declare
, je neslavný atribut „name-ref“, atribut -n
. ( A nyní obnovím koncept, který jsem pozastavil dříve ).
Atribut name-ref v zásadě umožňuje programátorům Bash jiný způsob, jak změnit hodnotu proměnné. Přesněji poskytuje nepřímý způsob, jak toho dosáhnout.
Zde je jak to funguje:
Jste declare
proměnná s atributem -n
a je velmi doporučujeme (i když to není striktně vyžadováno, ale dělá to jednodušší), že zároveň dáte hodnotu této velmi proměnné na stejné declare
. Takto:
declare -n baz="foo"
To Bashovi říká, že od té doby při každém použití nebo změně hodnoty proměnné s názvem baz
bude skutečně použita nebo změna hodnoty proměnné s názvem foo
.
Což znamená, že od té doby jo můžete říci něco jako baz=10+3
, aby foo
získal hodnotu 13.Za předpokladu, že foo
bylo dříve deklarováno jako celé číslo (declare -i
), jako jsme to udělali před pouhou minutou, jinak získá sekvenci ze čtyř znaků 1
0
+
3
.
Také: pokud změníte hodnotu foo
přímo, jako v foo=15
, uvidíte 15 také vyslovením echo “${baz}”
. Důvodem je, že proměnná baz
deklarovaná jako název ref foo
vždy odráží foo
value.
Výše uvedený declare -n
příkaz je označován jako „name-reference“, protože vytváří proměnnou baz
odkazovat na název jiné proměnné. Ve skutečnosti jsme deklarovali, že baz
má hodnotu „foo“, kterou kvůli možnosti -n
zpracovává Bash jako název pro další proměnná.
Nyní, proč na Zemi byste to někdy chtěli udělat?
No .. stojí za to říci, že se jedná o funkci pro docela pokročilé potřeby.
Ve skutečnosti tak pokročilý, že když programátor narazí na problém, který by skutečně vyžadoval označení názvu, je také je pravděpodobné, že takový problém by měl být spíše vyřešen použitím vhodného programovacího jazyka místo Bash.
Jednou z těchto pokročilých potřeb je například to, když jako programátor během vývoje nemůžete vědět kterou proměnnou budete muset použít v určitém bodě skriptu, ale bude plně známa dynamicky za běhu. A vzhledem k tomu, že žádný programátor nemůže za běhu zasahovat, jedinou možností je zajistit předem pro takovou situaci ve skriptu a „životopis“ může být jediným životaschopným cesta. Jako obecně známý případ použití této pokročilé potřeby zvažte například zásuvné moduly. Programátor programu podporujícího „zásuvné moduly“ musí předem provést obecná opatření pro budoucí (a možná i třetí) zásuvné moduly. Programátor proto bude muset v Bashi používat zařízení, jako je ref. Jmen.
Další pokročilou potřebou je, když se musíte vypořádat s velkým množstvím dat v RAM a také musíte předat tato data kolem funkcí vašeho skriptu, které také musíte tato data během cesty upravit. V takovém případě byste určitě mohli zkopírovat tato data z jedné funkce do jiné (jako to Bash dělá, když děláte dest_var="${src_var}"
nebo když vyvoláváte funkce jako v myfunc "${src_var}"
), ale vzhledem k obrovskému množství těchto dat by to znamenalo obrovské plýtvání RAM a pro velmi neefektivní provoz. Řešení, pokud takové situace nastanou, je tedy použít ne kopii dat, ale odkaz na tato data. V Bash, ref. Jména Tento případ použití je ve všech moderních programovacích jazycích opravdu normou, ale je zcela výjimečný, pokud jde o Bash, protože Bash je většinou navržen pro krátké jednoduché skripty, které se většinou zabývají soubory a externími příkazy, a proto Bash skripty zřídka musí projít množství dat mezi funkcemi. A když funkce skriptu potřebují sdílet některá data (přistupovat k nim a upravovat je), obvykle se toho dosáhne pouhým použitím globální proměnné, což je ve skriptech Bash zcela běžné, stejně jako velmi zastaralé ve správných programovacích jazycích.
Potom může existovat pozoruhodný případ použití jmen v Bash a (možná ironicky) je přidružen, když používáte ještě jiné typy proměnných:
- proměnné, které jsou deklarovány jako „indexovaná pole“ (
declare -a
) - proměnné, které jsou deklarovány jako „asociativní pole“ (
declare -A
).
Jedná se o typ proměnných, které lze snadněji (a také efektivněji) předávat funkcím používáním názvů namísto běžného kopírování, i když nepřenášejí obrovské množství dat.
Pokud všechny tyto příklady zní divně a stále nepochopitelně, je to jen proto, že názvové odkazy jsou skutečně pokročilé téma a vzácná potřeba typického scénáře použití B. popel.
Mohl bych vám říci o příležitostech, pro které jsem pro jednoho našel použití pro jména v Bash, ale zatím to byly většinou pro „esoterické“ a komplikované potřeby, a já obávám se, že kdybych je popsal, komplikoval bych vám to pouze v tomto bodě vašeho učení. Stačí zmínit nejméně složité (a možná ne esoterické): vrácení hodnot z funkcí. Bash tuto funkci opravdu nepodporuje, takže jsem to samé získal pomocí name-refs. Toto je mimochodem přesně to, co dělá váš příkladový kód.
Kromě toho malá osobní rada, která by se ve skutečnosti lépe hodila pro komentář, ale já jsem ji nedokázal dostatečně zhuštit. aby se vešly do limitů komentáře StackExchange.
Myslím si, že nejvíce , co byste měli v tuto chvíli udělat, je jen experimentovat s ref. jmény pomocí jednoduchých příkladů, které jsem ukázal, a možná s příkladem kódu, který jste poskytli, bez ohledu na pro tuto chvíli část „proč na zemi“ a zaměřuje se pouze na část „jak to funguje“. Trochu experimentováním může část „jak“ lépe zapadnout do vaší mysli, takže vám část „proč“ vyjasní v pravý čas, kdy (nebo jestli) budete mít skutečný praktický problém, pro nějž název – ref by se opravdu hodil.
Komentáře
- LL3 Vaše odpověď se mi moc líbí a palec nahoru: Konečně chápu, co prohlašuje – – nedeklarovat proměnné, ale deklarovat jejich atributy; ale bohužel jsem ztratil přehled, když jsi začal vysvětlovat, co je to název. Nemám ponětí, co to dělá a proč to používat.
- To je důvod – proč by někdo dal tento atribut
- @JohnDoea vidím. Možná byste pro tuto chvíli mohli toto téma opustit. Je pravděpodobně příliš brzy pochopit tento koncept v aktuálním bodě vašeho učení. Každopádně jsem svou odpověď rozšířil o další příklady a také o malý osobní dodatek o tom, jak si myslím, že byste měli postupovat. Rovněž jsem vložil vodorovné čáry, abych oddělil obecné vysvětlení
declare
od konkrétního vysvětlení-n
z osobního dodatku. Sem tam jsem také trochu přeformuloval, ale nic podstatného, takže si myslím, že si můžete znovu přečíst část-n
a malý dodatek. - Děkuji, myslím, že ‚ je v pořádku, abych se o tom právě teď učil, potřebuji jen vysvětlení, kterému rozumím, a měl bych si dnes znovu přečíst celou vaši odpověď, ‚ jsem tady.
- Uvádíte
foo="bar"
adeclare foo="bar"
. Možná byste chtěli zmínit (i když pouze v poznámce pod čarou), že ve funkci shelludeclare foo="bar"
vytvoří místní proměnnou afoo="bar"
vytvoří globální proměnná.
Odpověď
Obecně declare
v bash
prostředí nastavuje (nebo odebírá nebo zobrazuje) atributy na proměnné. Atribut je druh anotace, která říká „toto je odkaz na jméno“ nebo „toto je asociativní pole“ nebo „tato proměnná by měla být vždy vyhodnocena jako celé číslo“ nebo „tato proměnná je pouze pro čtení a nemůže be re-set „, or“ this variable is exported (an environment variable) „atd.
Vestavěný typeset
je synonymem pro declare
v bash
, protože typeset
se používá v jiných skořápkách (ksh
, odkud pochází, a zsh
například) pro nastavení atributů proměnných.
Podíváme se blíže na příklad odkazu na název v otázka:
Funkce shellu, kterou zobrazíte, s přidanou trochou kódu, který ji používá:
#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi } read_and_verify foo printf "The variable "foo" has the value "%s"\n" "$foo"
Spuštění tohoto:
$ bash script.sh Please enter value for "foo": hello Please repeat the value to verify: hello? Values unmatched. Please try again. The variable "foo" has the value ""
To ukazuje, že proměnná foo
není nastavena na nic, když uživatel zadá dvě různé řetězce.
To ukazuje, že proměnná foo
se nastaví na řetězec, který uživatel zadal, když dvakrát zadal stejný řetězec .
Způsob, jakým $foo
získá hodnotu hello
v hlavní části skriptu, je v následujících řádcích ve funkci shellu:
declare -n ref="$1" ref=$tmp1
kde $tmp1
je řetězec hello
zadaný uživatelem a $1
je řetězec foo
předaný na příkazovém řádku funkce z hlavní části skript.
Všimněte si, že proměnná ref
je deklarována s declare -n
jako proměnnou odkazu na název a hodnotou foo
se v této deklaraci uvádí jako hodnota. To znamená, že od tohoto okamžiku, dokud proměnná neprojde z rozsahu, bude jakékoli použití proměnné ref
stejné jako použití foo
. Proměnná ref
je referenční proměnná názvu odkazující na foo
v tomto okamžiku.
To má za následek, že přiřazení hodnoty k ref
, jak je to provedeno na řádku za deklarací, přiřadí hodnotu foo
.
Hodnota hello
je poté k dispozici v $foo
v hlavní části skriptu.
declare name
následovanýdeclare -p name
získá „bash: declare: name: not found“. (Ačkolideclare -p | grep na
přinášídeclare -- name
.) (2) Domnívám se, že je trochu zavádějící představovatecho "${name-isunset}"
v kontextudeclare name
, jelikož zachází s nedeklarovanou (tj. nedefinovanou) proměnnou stejně jako s deklarovanou ale deaktivovat proměnnou. (3) Možná budete chtít zmínit, že namerefs jsou k dispozici pouze v bash verzi 4.3 a vyšší.GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)
na Arch Linuxu stále přináší výsledky, které jsem ukázal. Možná, že toto chování bylo představeno teprve nedávno, to ‚ prozkoumám.declare x
nenastavuje ‚ tx
, zatímcodeclare x=
ano. Nemohl jsem ‚ najít žádný odkaz na podporu tvrzení, žedeclare -- x
(jako výstupdeclare -p x
) znamená “ nenastaveno „, zatímcodeclare -- x=""
znamená “ set „; přinesl jsem tedy${parameter-word}
expanzi, i když nemůže rozlišovat mezi “ unset “ a “ neexistuje ‚ „, jak podotknete. I ‚ si nejsem jistý, jak to mohu ve své odpovědi objasnit (aniž bych to čtenáře rozptylovalo od bodu).