Как Bash может выполнить команду в другом контексте каталога?

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

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

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

Ответы на вопрос(4)

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

 Konstantin22 мар. 2018 г., 13:46
@ apieceofbart Я думаю, ты имел в видуpopd вместо тогоpulld.
 apieceofbart23 янв. 2018 г., 13:44
или ты мог бы сделатьpushd && YOUR COMMAND && pulld
 apieceofbart22 мар. 2018 г., 18:44
@ Константин да, я сделал! мой плохой, спасибо!
Решение Вопроса

Вы можете использоватьcd встроенный илиpushd а такжеpopd встроенные для этой цели. Например

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Вы используете встроенные функции, как и любую другую команду, и можете изменять контекст каталога столько раз, сколько захотите в скрипте.

 boycy13 февр. 2019 г., 11:36
@ VadimKotov Я думаю, что по сути это неоперация. Соответствующий разделman bash читает:: [arguments] Нет эффекта; команда не делает ничего, кроме расширения аргументов и выполнения любых указанных перенаправлений. Статус возврата равен нулю.
 geekosaur12 мая 2012 г., 21:17
Есть такжеcd - в оболочке POSIX, чтобы вернуться к предыдущему каталогу. Тем не менее, (а)pushd а такжеpopd действительно предназначены для интерактивного использования, и (б) не всегда можно предположить, что вы можетеcd назад, с чего ты начал,особенн в сложных подсистемах, которые могут использовать ограничительные разрешения внутри (см. / Stackoverflow.com вопросы / 10555284 / ...).
 Muhammad Umer13 июн. 2016 г., 23:15
Я в замешательстве, можете ли вы добавить пример команды, например,ls
 connorbode17 февр. 2017 г., 03:26
Для написания сценариев, возможно, лучшая идея - подоболочка. Однако я очень рад узнать оpopd.
 josh123a12319 апр. 2016 г., 16:31
Использование подоболочки - намного лучшее решение

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

(cd wherever; mycommand ...)

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

(cd /path/to/your/special/place;/bin/your-special-command ARGS)

Ваш ответ на вопрос