В этом случае вам вообще не нужно менять рабочий каталог (, как ответил Кусалананда ). Однако, если вы имеете дело с командами, которым действительно нужен конкретный рабочий каталог, вам нужно знать несколько вещей, которые облегчат вам задачу.
Во-первых, поскольку cd
устанавливает переменную OLDPWD
, мы можем использовать ее для возврата в исходный каталог, не зная его имени. Во-вторых, мы, вероятно, хотим вернуть, была ли команда выполнена успешно, поэтому используйте ;
, а не &&
там:
cd "$workdir" && somecommand ; cd "$OLDPWD"
Это по-прежнему ненадежно, если первый cd
выходит из строя; чтобы быть более надежным, нам действительно нужно
if cd "$workdir" ; then somecommand ; cd "$OLDPWD" ; fi
Даже на этом этапе мы боремся, нужен ли нам статус выхода somecommand
после этого.
Обычно лучше запускать команду в подоболочке и изменять только рабочий каталог подоболочки:
( cd "$workdir" && somecommand )
Последний подход я обычно использую и рекомендую, если только вы не делаете что-то, что невозможно из подоболочки, например, устанавливаете переменные для последующих команд.
Известная ошибка :«Утечка памяти в goferd на клиентах, подключенных к Red Hat Satellite 6.2.x, когда qrouterd недоступен».