获取脚本后别名无法保留

获取脚本后别名无法保留

这是我的脚本:

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

相关内容