Когда вы передаете ввод из одного процесса или задания другому, вы также порождаете другой процесс. Оба этих задания считаются дочерними по отношению к главному процессу, который их вызвал (обычно это процесс, запускающий эмулятор терминала).
# 2 process are run here
# first job: echo
# second job: ls
echo "/home/" | ls
Глядя на источник для zsh
, похоже, что cwd
задания отличается от оригинала. cwd
задания после выполнения он уведомит пользователя сообщением типа (pwd now: foo)
. Это помогает гарантировать, что пользователь точно знает, где они находятся в дереве каталогов, что особенно полезно, когда он, возможно, не собирался этого делать. Ниже взято из jobs.c, где cwd
(обозначается как pwd
), где, среди прочего, cwd
(обозначается как pwd
) сравниваются перед печатью сообщения (pwd now: foo)
. Если они разные, сообщение печатается, если равны - нет.
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
просто заполнит stdin
вместо cd
, но это содержимое будет проигнорировано. Из-за этого передача в 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
person
joshmeranda
schedule
24.08.2020