Я использую tmux (более гибкий, чем screen) на своем сервере, и для выполнения команды непосредственно после подключения:
ssh myserver -t 'tmux send-keys -t session-name "ls ./" C-m; tmux attach -t session-name '
Вам просто нужно убедиться, что запущена сессия с именем session-name. C-m эмулирует ENTER после ввода "ls ./"
В этом случае вам вообще не нужно менять рабочий каталог (, как ответил Кусалананда ). Однако, если вы имеете дело с командами, которым действительно нужен конкретный рабочий каталог, вам нужно знать несколько вещей, которые облегчат вам задачу.
Во-первых, поскольку cd
устанавливает переменную OLDPWD
, мы можем использовать ее для возврата в исходный каталог, не зная его имени. Во-вторых, мы, вероятно, хотим вернуть, была ли команда выполнена успешно, поэтому используйте ;
, а не &&
там:
cd "$workdir" && somecommand ; cd "$OLDPWD"
Это по-прежнему ненадежно, если первый cd
выходит из строя; чтобы быть более надежным, нам действительно нужно
if cd "$workdir" ; then somecommand ; cd "$OLDPWD" ; fi
Даже на этом этапе мы боремся, нужен ли нам статус выхода somecommand
после этого.
Обычно лучше запускать команду в подоболочке и изменять только рабочий каталог подоболочки:
( cd "$workdir" && somecommand )
Последний подход я обычно использую и рекомендую, если только вы не делаете что-то, что невозможно из подоболочки, например, устанавливаете переменные для последующих команд.
Честно говоря, я вообще не вижу смысла в двух обращениях к cd
.
Похоже, вы не используете cd
каталог, в который зашли, ни для чего. Вы указываете абсолютный путь для расположения дампа базы данных. Если требуется какой-либо пользовательский файл конфигурации MySQL, он в любом случае будет взят из домашнего каталога пользователя.
Таким образом, вполне вероятно, вы могли бы просто использовать
mysqldump -uroot -p"craft" --add-drop-table craft \
> ~/../docker-entrypoint-initdb.d/base.sql
независимо от того, из какого каталога вы его запускаете.