【问题标题】:Unix: (pwd now: ~) from cd command?Unix: (pwd now: ~) 来自 cd 命令?
【发布时间】:2020-12-13 11:59:55
【问题描述】:

我就是我,我一直在玩终端 (zsh。) 我尝试过的一件事(在一个空目录中)是 mkdir test; ls | cd应该创建一个文件夹然后打印所有文件夹(只有那个)并将输出通过管道传输到 cd。所以我希望它带我到测试目录,但我得到了(pwd now: ~),它把我带回了主目录。有人知道为什么吗?查找它没有任何用处。

编辑:它把我带到 ~ 目录,因为 cd 不接受标准输入,而是目录是一个参数。我仍然想知道的是,为什么运行 ls | cd 会得到输出 (pwd now: ~) 而不是什么都没有。运行 echo test | cd 没有输出,但 ls | cd 有。

【问题讨论】:

标签: unix pipe zsh ls cd


【解决方案1】:

当您将输入从一个进程或作业“管道”到另一个时,您也在生成另一个进程。这两个作业都被称为调用它们的主进程(通常是运行终端模拟器的进程)的“子进程”。

# 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

【讨论】:

  • 那么当我将文本从 ls 输入到它时,为什么 cd 会给出 (pwd now: ~) 输出?当我做echo test | cd 或只是cd 时它不会给出那个输出,但是当我做ls | cd 时它会给出。
  • 这似乎是特定于 shell 的行为,我无法在 fishbashsh 上重现它。您使用的是哪个 shell 和什么版本?
  • 我使用 zsh 是因为 bash 告诉我要使用它
  • 哦,好吧,它看起来像是特定于 zsh 实现或进程处理的输出。让我看看它,我会更新我的答案
  • 我从我可以从源收集的信息中添加了对消息根本原因的“浅层”解释。我欢迎更多参与其开发或了解zsh 内部运作的人提供任何意见。
猜你喜欢
  • 2013-07-09
  • 2014-11-30
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多