这是我的脚本:
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
这是它的输出:
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
我很困惑。这是我写过的最简单的代码之一,但它没有做它应该做的事情。
编辑:当我将回显线从 更改为 时echo $$
,echo $$ $BASHPID
第二个 PID ( $BASHPID
) 在循环内有所不同,但$$
始终保持不变。这可能是问题所在吗?
答案1
不要相信计算机告诉你的一切。
$ 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
当您执行此操作时some_command | while …
,shell 会将while
循环放入子 shell 中,但$$
继续报告主(父)进程的 PID。在bash中,$BASHPID
揭示了真相。
考虑做
while read alias
do
alias "$alias"
done << EOF
s=screen
v=vlock -a
j=jobs
EOF