Вы не можете сделать это;каждый дочерний процесс имеет свой рабочий каталог, унаследованный от родительского процесса.В этом случае ваш cd
получает свой рабочий каталог от своего родителя (вашей оболочки).Дочерний процесс не может изменить каталог - или любое другое состояние - родительского процесса.
Это базовое разделение процесса.Разрешение дочерним процессам влиять на своих родителей будет иметь всевозможные проблемы безопасности и удобства использования.
Оболочки реализуют cd
как «специальную встроенную функцию».Это не внешний двоичный файл:
$ where cd
cd: shell built-in command
Другими словами, когда оболочка запускает команду cd
, она запускается в том же процессе, что и остальная часть оболочки.
Основная логикаREPL оболочки выглядит примерно так:
for {
line := waitForInputLine()
switch {
case strings.HasPrefix(line, "cd"):
os.chdir(strings.Split(line, " ")[1])
// ..check other builtins and special cases./
default:
runBinary(line)
}
}
Невозможно реализовать это во внешнем двоичном файле, независимо от того, какой язык вы используете для его реализации.