Есть идеи, почему это происходит?
Может быть, ваши commands включают cd . Вы выполняете commands; bash , поэтому bash запускается в любом конце каталога commands .
Очевидное решение состоит в cd назад как раз перед тем, как вызвать bash Пытаться
ssh -t $server 'commands; cd "$HOME"; exec bash -l'
Заметки:
- Одиночные кавычки мешают локальному расширению
$HOME ; если вам нужны commands для включения локально раскрываемых переменных, смешайте кавычки (например, "commands with $var; "'cd "$HOME"; exec bash -l').
exec , потому что вам больше не нужна родительская оболочка на удаленной стороне (или вам?).
-l (эквивалентно --login), потому что единственный ssh $server порождает оболочку входа в систему, и вы хотите, чтобы вся ваша команда действовала одинаково. Bash в качестве оболочки входа в систему использует файлы, отличные от оболочки, не входящей в систему, начиная с /etc/profile ; правила несколько сложны, смотрите man 1 bash , ищите INVOCATION . Если один из этих файлов выполняет cd в другой каталог, вы получите то, что получите, даже если commands не меняют каталог. Вы не сказали, что такое каталоги ("правильный" и "неправильный"), поэтому трудно даже догадаться, какова цель этого "скрытого" cd .
Или вы можете запускать commands в подоболочке. Это не повлияет на рабочий каталог родительской оболочки, поэтому bash будет запускаться везде, где запускается родительская оболочка:
ssh -t $server '(commands); exec bash -l'
Вы можете предпочесть одно решение или другое в зависимости от того, что делают commands . Например, если commands изменяют среду своей оболочки на удаленной стороне, то запуск их в подоболочке или нет имеет значение для окончательного варианта bash .