Não acredite em tudo que um computador lhe diz.
$ ps -p $$
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
$ ps -t pts/1
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
4285 pts/1 00:00:00 ps
$ echo foo | while read x
do
ps -t pts/1
done
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
4287 pts/1 00:00:00 bash
4288 pts/1 00:00:00 ps
$ echo "$$, $BASHPID"
3744, 3744
$ echo foo | while read x
do
echo "$$, $BASHPID"
ps -t pts/1
done
3744, 4292
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
4292 pts/1 00:00:00 bash
4293 pts/1 00:00:00 ps
Quando você faz some_command | while …
,
o shell coloca o loop while
em um subshell,
mas $$
continua a relatar o PID do processo principal (pai).
No bash, $BASHPID
revela a verdade.
Considere fazer
while read alias
do
alias "$alias"
done << EOF
s=screen
v=vlock -a
j=jobs
EOF