У меня есть обычная команда, которая вызывается из очень определенных каталогов. Для этой программы в / bin находится только один исполняемый файл, и текущий рабочий каталог очень важен для его правильной работы. Сценарий влияет на файлы, которые находятся внутри каталога, в котором он запущен.
Теперь у меня также есть собственный сценарий оболочки, который выполняет некоторые действия в одном каталоге, но мне нужно вызвать эту команду, упомянутую выше, как если бы она находилась в другом каталоге.
Как это сделать в сценарии оболочки?
bash
shell
working-directory
Марти Уоллес
источник
источник
Ответы:
Для этой цели вы можете использовать
cd
встроенную команду или встроенные командыpushd
иpopd
. Например:# do something with /etc as the working directory cd /etc : # do something with /tmp as the working directory cd /tmp :
Вы используете встроенные команды, как и любую другую команду, и можете изменять контекст каталога сколько угодно раз в сценарии.
источник
cd -
в оболочке POSIX есть возможность вернуться в предыдущий каталог. Тем не менее, (а)pushd
иpopd
действительно предназначены для интерактивного использования, и (б) не всегда безопасно предполагать, что вы можетеcd
вернуться туда, откуда начали, особенно в сложных подсистемах, которые могут использовать внутренние ограничительные разрешения (см. Stackoverflow.com/questions/ 10555284 /… ).popd
.:
здесь означает символ?man bash
читает:: [arguments]
Нет эффекта; команда не делает ничего, кроме расширения аргументов и выполнения любых указанных перенаправлений. Статус возврата равен нулю.Использование
cd
в подоболочке; сокращенный способ использования подоболочки - круглые скобки.(cd wherever; mycommand ...)
Тем не менее, если ваша команда имеет среду, которая ей требуется, она действительно должна гарантировать, что сама среда, вместо того, чтобы возлагать ответственность на все, что может захотеть ее использовать (если только это не внутренняя команда, используемая в очень конкретных обстоятельствах в контексте хорошо определил более крупную систему, так что любой вызывающий уже должен гарантировать среду, которую он требует). Обычно это будет своего рода оболочка сценария оболочки.
источник
\
после каждой;
для многострочных команд в том же контексте.(cd /path/to/your/special/place;/bin/your-special-command ARGS)
источник
Если вы хотите вернуться в текущий рабочий каталог:
current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
current_dir
равную вашемуpwd
cd
где вам нужно запустить свою командуcd
вернемся к нашей переменнойcurrent_dir
Другое решение от @apieceofbart
pushd && YOUR COMMAND && popd
источник
pushd && YOUR COMMAND && pulld
popd
вместоpulld
.