Вопреки сказанному, вы можете сделать это, заменив образ процесса дважды.
В bash замените функцию my_cd на:
function my_cd() {
exec /path/to/my_cd.py "$BASH" "$0"
}
Тогда ваш скрипт на python должен заканчиваться на:
os.execl(sys.argv[1], sys.argv[2])
Не забудьте import os, sys
в начале сценария.
Но учтите, что это пограничный хак. Ваша оболочка умирает, заменяя себя скриптом python, и запускает в том же процессе . Скрипт python вносит изменения в среду и заменяет себя оболочкой, опять же, в том же процессе. Это означает, что если у вас есть другие локальные несохраненные и неэкспортированные данные или среда в предыдущем сеансе оболочки, они не сохранятся в новом сеансе. Это также означает, что сценарии rc и profile будут запущены снова (обычно это не проблема).