Вопрос или проблема
Я использую программу командной строки, в документации которой говорится:
«Вы можете запустить XXX с вводу, находящегося в другой директории, но его вывод всегда будет помещен в текущую рабочую директорию».
Мне бы хотелось, чтобы вывод записывался в другую директорию. Я мог бы (либо с помощью cd
, либо pushd
+ popd
)
- перейти в директорию вывода
- выполнить команду, чтобы вывод оказался там
- затем вернуться обратно
или
- выполнить команду в текущем месте
- переместить вывод в папку вывода
…но оба варианта кажутся громоздкими и подверженными ошибкам, если сценарий будет редактироваться кем-то, кто не осведомлен об этом требовании. Единственное другое решение, которое я могу представить, это соединить команды с помощью точек с запятой. Есть ли другой способ?
Это, кстати, в bash.
Используйте круглые скобки, чтобы cd выполнялся в подсистеме:
(cd other_dir && xxx)
Когда это закончится, ваша текущая рабочая директория не изменится.
cd может потерпеть неудачу, поэтому используйте &&
, чтобы условно выполнить программу.
Ответ или решение
Вопрос о том, как вызвать команду, осуществляя работу в другой директории, но при этом сохранять выходные данные в текущей рабочей директории, может показаться сложным. Однако есть несколько эффективных способов, чтобы избежать проблем, связанных с перемещением в другие каталоги, что делает процесс более безопасным и надежным. Рассмотрим эти методы более подробно.
Метод с использованием подшелла
Наиболее элегантный и распространенный способ заключается в использовании подшелла. Это позволяет вам выполнить команду в контексте другой директории, не изменяя основную рабочую директорию, что защищает от ошибок, если другой пользователь активирует скрипт, не осознавая вашу настройку.
Для этого используйте следующую конструкцию:
(cd /путь/к/другой/директории && ваша_команда)
Объяснение:
( ... )
: Задает подшелл, в котором будут выполнены указанные команды.cd /путь/к/другой/директории
: Пытается сменить директорию. Если команда успешна, выполняется следующая команда.&&
: Условный оператор, который позволяет выполнить следующую команду только в случае успешного выполнения предыдущей.ваша_команда
: Замените это на команду, которую вы хотите выполнить.
Если смена директории по какой-то причине не удалась, ваша программа не будет запущена, что также поможет избежать ошибок.
Преимущества метода
- Остается в текущей директории: После завершения группировки команд ваша рабочая директория не меняется, что делает этот способ предпочтительным.
- Минимизация ошибок: Исключает возможность забыть вернуться в исходную директорию.
- Чистота кода: Код становится более читабельным и поддерживаемым.
Другие варианты
-
Переход и возврат (способы с
cd
иpopd
): Это альтернатива, но может быть неэффективной, особенно если команды ближайшие по контексту, так как потребуется возвращаться в исходное местоположение. -
Перемещение выходных данных: Можно запустить команду в текущей директории и затем создать отдельное действие для перемещения выходных данных. Однако это создаст дополнительный шаг, что также не всегда желательно.
-
Использование семиколонов: Хотя это позволительно, это менее предпочтительный путь, поскольку он не так удобен для восприятия.
Заключение
Использование подшеллов для изменения директории при вызове команд является наиболее практичным и аккуратным решением, которое убирает лишние шаги и упрощает процесс. Оно дает уверенность в том, что пользователи смогут легко понять код и не столкнуться с проблемами изменения рабочей директории. Рекомендуется использовать данный подход для повышения надежности и удобства ваших скриптов в Bash.