"cd | ls -R /" Командная оболочка создает два процесса с помощью fork или только один для ls?

Собственно это и не могу понять...
Здесь искал упоминание о том как должны вызываться built-in по стандарту, но не нашел.
Вопрос возник после того как jobs показал, что у cd есть pid:
[1]  - 50095 done       echo |
       50096 suspended  ls -R /
[2]  + 50659 done       cd |
       50660 suspended  ls -R /
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Это ведь так легко узнать, смотри:
$ strace -f -e clone,write,chdir bash -c "cd | echo 'zz'"
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1c61235a10) = 7494
strace: Process 7494 attached
[pid  7493] clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1c61235a10) = 7495
strace: Process 7495 attached
[pid  7494] chdir("/home/jcmvbkbc")     = 0
[pid  7495] write(1, "zz\n", 3zz
)         = 3
[pid  7494] +++ exited with 0 +++
[pid  7495] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=7494, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

strace запустил bash (7493), bash создал два процесса, один из них (7494) выполнил cd, второй (7495) -- echo.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Karpion
Я так понимаю, cd должен исполняться в контексте исходного shell-процесса, иначе он не сменит директорию. Однако, тогда надо серьёзно извращаться с пайпом...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы