Nacitani promennych v bash
Alexandr Malusek
malusek na hroch.ujf.cas.cz
Pátek Únor 13 12:21:17 CET 1998
farco na clnet.cz (Libor Pechacek) writes:
> > Michal Polak <mpolak na informatics.muni.cz> wrote:
> > -> Potrebuju do promennych dostat jednotlive radky nejakeho vystupu.
> > -> Bohuzel, promenne A,B,C jsou prazdne.
>
> volani_skriptu | { read A ; read B ; read C ; ...cokoli dalsiho... }
>
> To by asi mohlo byt reseni. Mimo blok uz promenne neexistuji, prestoze se
> blok provadi v aktualnim prostredi (alespon podle manu).
Nikoliv, timto zpusobem to resit nelze. Cituji z bash(1):
Each command in a pipeline is executed as a separate process (i.e., in
a subshell).
Blok se tedy uplatni v ramci subshellu, nikoliv aktualniho shellu. Pro
upresneni: rozsah platnosti promennych neni blokem omezen:
$ cat s4
#!/bin/sh
A=0; { A=1 } ; echo A = $A
$ ./s4
A = 1
Pokud jeste nejste presvedcen, podivejte se na nasledujici skript:
$ cat s3
#!/bin/sh
echo '$$ = ' $$
{ read N; read S; read P } </proc/self/status
echo $P
echo "line1" |
{
echo '$$ = ' $$
{ read N; read S; read P } </proc/self/status
echo $P
}
$ s3
$$ = 14798
Pid: 14798
$$ = 14798 Hlasi pid sveho rodice
Pid: 14800 Skutecny PID je ale jiny
No, snad jsem Vas uz presvedcil, ale pokud jeste ne, tak se podivejte
na toto:
$ cat s8
#!/bin/bash
echo rodic $$
echo "line1 $$" | { read A; echo potomek $$ }
$ strace -f s8 2>&1 | grep write
write(1, "rodic 14975\n", 12rodic 14975
[pid 14976] write(1, "line1 14975\n", 12 <unfinished ...>
[pid 14976] <... write resumed> ) = 12
[pid 14977] write(1, "potomek 14975\n", 14potomek 14975
Puvodni PID je 14975. bash pro prvni prikaz v kolone vytvoril subshell
s PID 14976, pro druhy prikaz vytvoril subshell s PID 14977. Presne
tak to popisuje dokumentace bash.
> Jinak, jen tak na okraj, 'read' je vestaveny prikaz, takze subshell se pro
> nej asi delat nebude. - Tot ono zminovane studium dokumentace.
Snad jsem to alespon trochu objasnil ;-)
--
A. Malusek (malusek na ujf.cas.cz)
UJF AV CR
Další informace o konferenci Linux