当您将输入从一个进程或作业“管道”到另一个时,您也在生成另一个进程。这两个作业都被称为调用它们的主进程(通常是运行终端模拟器的进程)的“子进程”。
# 2 process are run here
# first job: echo
# second job: ls
echo "/home/" | ls
查看zsh的来源,看起来当作业的cwd与执行后作业的原始cwd不同时,它会以(pwd now: foo)之类的消息通知用户。这有助于确保用户准确地知道目录树中的位置,这在他们可能不打算这样做时特别有用。以下取自jobs.c,其中cwd(称为pwd)在打印(pwd now: foo)消息之前比较cwd(称为pwd)。如果它们不同,则打印消息,如果相等则不打印。
if ((lng & 4) || (interact && job == thisjob &&
jn->pwd && strcmp(jn->pwd, pwd))) {
doneprint = 1;
fprintf(fout, "(pwd %s: ", (lng & 4) ? "" : "now");
fprintdir(((lng & 4) && jn->pwd) ? jn->pwd : pwd, fout);
fprintf(fout, ")\n");
fflush(fout);
}
当您将某些内容通过管道传输到ch 时,您正在更改子进程中的cwd,并且在直接调用cd 时隐藏此消息的一些常规检查被忽略。否则cd字同理。
# changes directories into ./test
echo "test" | cd
# (pwd now: /path/to/test)
# changes directory to home
echo | cd
# (pwd now: /home/<username>)
# calling this again will not echo the message, since the cwd is already
# the home directory and no change occurs
echo | cd
至于为什么cwd 更改为主目录(~),这是因为cd 在没有给出路径作为参数时的行为方式。与许多 linux 命令不同,cd 不会从 stdin 中读取要进入的路径。因此,通过管道进入cd 将简单地为cd 填充stdin,但该内容被忽略。因为这个管道进入cd 与单独调用cd 相同。
# these next lines produce the same behavior
echo path/to/dir/test | cd
cd
当cd 没有收到要移动到的路径时,它会将您移动到您的主目录(在Linux 系统上引用为~)
# each of these lines produce the same behavior
cd /home/<username>
cd ~
cd