Os aliases não persistem após o script de origem

4

Aqui está o meu script:

echo "Defining aliases"
echo $$
echo "
s=screen
v=vlock -a
j=jobs
" | sed '/^$/d' | while read alias
do
  echo $$
  alias "$alias"
  alias | wc -l
done

E aqui está sua saída:

parthian@computer$ . aliases 
Defining aliases
3744
3744
4
3744
5
3744
6
parthian@computer$ ps -p $$
PID TTY          TIME CMD
3744 pts/1    00:00:03 bash
parthian@computer$ alias | wc -l
3

Estou desconcertado. Este é um dos códigos mais diretos que eu já escrevi, e ele não está fazendo o que é suposto fazer.

EDITAR: Quando altero as linhas de eco de echo $$ para echo $$ $BASHPID , o segundo PID ( $BASHPID ) é diferente dentro do loop, mas $$ permanece o mesmo. Este poderia ser o problema?

    
por Parthian Shot 25.06.2015 / 01:29

1 resposta

4

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
    
por 25.06.2015 / 02:01

Tags