Есть идеи, почему это происходит?
Может быть, ваши 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
.