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