Честно говоря, я вообще не вижу смысла в двух обращениях к cd
.
Похоже, вы не используете cd
каталог, в который зашли, ни для чего. Вы указываете абсолютный путь для расположения дампа базы данных. Если требуется какой-либо пользовательский файл конфигурации MySQL, он в любом случае будет взят из домашнего каталога пользователя.
Таким образом, вполне вероятно, вы могли бы просто использовать
mysqldump -uroot -p"craft" --add-drop-table craft \
> ~/../docker-entrypoint-initdb.d/base.sql
независимо от того, из какого каталога вы его запускаете.
Вы правильно поняли. Когда вы запускаете strace ls
, есть даже два форка. Оболочка разветвляется и использует exec()
для запуска strace
, а strace делает то же самое для запуска ls
.
Вы не видите ветвление в выводе strace, потому что strace выводит все системные вызовы, исходящие из дочернего процесса strace и на тот момент вилка уже произошла:
bash
развилки и трассыstrace
strace
вилки
Родительский процесс strace
присоединяется к дочернему процессу для перехвата всех системных вызовов.
С этого момента вы видите только системные вызовы.
Ребенок strace
запускает ls
, используяexecve()
Один из способов увидеть развилки — прикрепить strace
"извне":
echo $$
для получения идентификатора процесса оболочки strace -f --attach=PID
с заменой «PID» на идентификатор процесса, указанный выше в другой консоли . ls
в первой оболочке fork()
/ clone()
). Следует также упомянуть, что fork()
в современных ядрах Linux реализуется с помощью системного вызова clone()
, так что вы, вероятно, увидите clone(…)
вместо fork()
в выводе strace.