[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: бага в bash?



В догонку напишу ещё вот что
$ zsh
% a="0"; echo -e "a\nb\nc" | while read i; do a="1"; echo $i; ps; done; echo $a

a
 PID TTY          TIME CMD
5636 pts/1    00:00:00 zsh
5688 pts/1    00:00:00 ps
b
 PID TTY          TIME CMD
5636 pts/1    00:00:00 zsh
5689 pts/1    00:00:00 ps
c
 PID TTY          TIME CMD
5636 pts/1    00:00:00 zsh
5690 pts/1    00:00:00 ps
1
^D
$ a="0"; echo -e "a\nb\nc" | while read i; do a="1"; echo $i; ps; done; echo $a
a
 PID TTY          TIME CMD
5691 pts/1    00:00:00 bash
5721 pts/1    00:00:00 bash
5722 pts/1    00:00:00 ps
b
 PID TTY          TIME CMD
5691 pts/1    00:00:00 bash
5721 pts/1    00:00:00 bash
5723 pts/1    00:00:00 ps
c
 PID TTY          TIME CMD
5691 pts/1    00:00:00 bash
5721 pts/1    00:00:00 bash
5724 pts/1    00:00:00 ps
0

Тогда как первая конструкция в баше дочернего процесса не создаёт
$ a="0"; for i in a b c; do a="1"; echo $i; ps; done; echo $a
a
 PID TTY          TIME CMD
5691 pts/1    00:00:00 bash
5730 pts/1    00:00:00 ps
b
 PID TTY          TIME CMD
5691 pts/1    00:00:00 bash
5731 pts/1    00:00:00 ps
c
 PID TTY          TIME CMD
5691 pts/1    00:00:00 bash
5732 pts/1    00:00:00 ps
1



Как виндо баш обрабатывает этот синтаксис по другому, а именно создаёт дочерний процесс, а та 'а', что в цикле просто изменяется в дочернем процессе. Соответственно, когда цикл заканчивается, управление передаётся родительскому, а там 'а' и не менялось...

А глюк ли это...надо смотреть POSIX стандарт на шел.



Reply to: