Вопрос по shell, bash, working-directory – Как Bash может выполнить команду в другом контексте каталога?

58

У меня есть общая команда, которая вызывается из очень определенных каталогов. Для этой программы есть только один исполняемый файл, расположенный в / bin, и текущий рабочий каталог очень важен для его правильной работы. Сценарий влияет на файлы, которые находятся внутри каталога, в котором он запущен.

Теперь у меня также есть собственный сценарий оболочки, который делает некоторые вещи в одном каталоге, но мне нужно вызвать эту команду, упомянутую выше, как если бы она была в другом каталоге.

Как вы делаете это в сценарии оболочки?

Ваш Ответ

4   ответа
23

Вы можете использовать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 вопросы / 10555284 / ...). geekosaur
Использование подоболочки - намного лучшее решение josh123a123
Я в замешательстве, можете ли вы добавить пример команды, например,ls Muhammad Umer
Для написания сценариев, возможно, лучшая идея - подоболочка. Однако я очень рад узнать оpopd. connorbode
@ VadimKotov Я думаю, что по сути это неоперация. Соответствующий разделman bash читает:: [arguments] Нет эффекта; команда не делает ничего, кроме расширения аргументов и выполнения любых указанных перенаправлений. Статус возврата равен нулю. boycy
153

Используйтеcd в скорлупе; сокращенный способ использовать этот вид подоболочки - круглые скобки.

(cd wherever; mycommand ...)

Тем не менее, если ваша команда имеет среду, которая ей требуется, она должна действительно гарантировать, что сама среда вместо того, чтобы возлагать ответственность на все, что может ее использовать (если это не внутренняя команда, используемая в очень специфических обстоятельствах в контексте четко определенная большая система, такая, что любой вызывающий абонент уже должен обеспечить среду, в которой он нуждается). Обычно это какая-то оболочка сценария оболочки.

23
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
13
Если вы хотите вернуться в свой текущий рабочий каталог:
current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
Мы устанавливаем переменнуюcurrent_dir равно вашемуpwd после этого мы идем кcd туда, где нужно запустить команду тогда мы запускаем команду тогда мы идем кcd назад к нашей переменнойcurrent_dir

@ apieceofbart Я думаю, ты имел в видуpopd вместо тогоpulld. Konstantin
или ты мог бы сделатьpushd && YOUR COMMAND && pulld apieceofbart
@ Константин да, я сделал! мой плохой, спасибо! apieceofbart

Похожие вопросы