#!/bin/bash function tisk() { echo -e "line 1\nline 2\nline 3\nline 4" } while read nacteno;do echo "precetl $nacteno";done <(tisk)Po spusteni to zahlasi chybu
./a: line 7: syntax error near unexpected token `<(tisk)' ./a: line 7: `while read nacteno;do echo "precetl $nacteno";done <(tisk)'Pritom ale nasledujici kod probehne v poradku
#!/bin/bash function tisk() { echo -e "line 1\nline 2\nline 3\nline 4" } cat <(tisk)Mate nekdo tuseni, proc nefunguje presmerovani stdin do toho read?
$ echo <(echo "ahoj") /dev/fd/63Místo
while read nacteno;do echo "precetl $nacteno";done <(tisk)prostě použij
tisk | while read nacteno;do echo "precetl $nacteno";donea je vymalováno.
( prikaz1 ; prikaz2 ; prikaz3 ) | while read ....
denne, vcetne zjednodusene formy prikaz | while ....
.
Tohle byl problem v jinem skriptu, ale privedlo me to na jednu myslenku. Pokud spustim prikaz | while read ... ; do A=neco;done
, pak promenna A je zapomenuta a v dalsim kodu ji nepouziju. Tak jsem myslel, ze ten <()
by mohl tenhle problem resit. while
by se provadelo v aktualnim bashi akorat vstup by byl zmenenej z toho prikazu. Jina moznost me napadla zduplikovat STDIN a pak na stdin presmerovat vystup z toho programu neco jako exec 15<&0 <(tisk)
, ale tohle se mi taky nejak nepovedlo, stejne tak ani bash -c 'while read .....' <(tisk)
, coz by ale snad fungovat melo.
Nejakej napad, jak spustit while na vystup z nejakyho programu tak, aby ten while bezel v aktualnim bashi a nespustil podproces a zachovaly se tak nastaveni promennych v aktualnim bashi?
#!/bin/bash if [[ -z "$LOCKED" ]] then echo "ceka na zamek" touch ./tmp/lock export LOCKED=1 exec flock ./tmp/lock "$0" "$@" else echo "jedeme dal" fi
Co takhle „mv -i“ kterej se te zepta na konfirmaci prepsani. V noven shellu pak „pgrep mv | xargs kill –9“ a tim to na pozadi zabit a vyhodnotit navratovou hodnotu.
Mel by jsi tak navratovou hodnotu toho, jesli lockfile existuje i za pomoci prikazu mv.
Je to trochu prez ruku a dost zprasek, ale vidis, ze i pomoci mv to jde a tudiz neni jak rikas k nicemu.