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

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

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

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


person Marty Wallace    schedule 12.05.2012    source источник


Ответы (3)


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

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

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

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

person Todd A. Jacobs    schedule 12.05.2012
comment
Также есть cd - в оболочке POSIX, чтобы вернуться в предыдущий каталог. При этом (а) pushd и popd действительно предназначены для интерактивного использования, и (б) не всегда безопасно предполагать, что вы можете cd вернуться туда, откуда начали, особенно в сложных подсистемах, которые могут использовать ограничительные внутренние разрешения (см. stackoverflow.com/questions/10555284/). - person geekosaur; 12.05.2012
comment
Использование подоболочки - гораздо лучшее решение - person josh123a123; 19.04.2016
comment
Для написания сценариев подоболочка, вероятно, будет лучшей идеей .. Однако я действительно счастлив узнать о popd. - person connorbode; 17.02.2017
comment
Не могли бы вы объяснить, что здесь означает символ :? - person Vadim Kotov; 12.03.2018
comment
@VadimKotov Я думаю, что это действительно запретная игра. Соответствующий раздел man bash гласит: : [arguments] Нет эффекта; команда не делает ничего, кроме раскрытия аргументов и выполнения любых указанных перенаправлений. Статус возврата равен нулю. - person boycy; 13.02.2019
comment
Для всех, кто интересуется, посмотрите здесь - stackoverflow.com/questions/3224878/ - person Vadim Kotov; 13.02.2019

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

(cd wherever; mycommand ...)

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

person geekosaur    schedule 12.05.2012
comment
Вы также можете вставить \ после каждого ; для многострочных команд в одном контексте. - person Chiramisu; 04.01.2020
comment
Крадущийся тигр, скрытый лучший ответ - person user; 04.01.2021

Если вы хотите вернуться в текущий рабочий каталог:

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

Другое решение от @apieceofbart pushd && YOUR COMMAND && popd

person abc123    schedule 06.11.2014
comment
или вы могли бы сделать pushd && YOUR COMMAND && pulld - person apieceofbart; 23.01.2018
comment
@apieceofbart Я думаю, вы имели в виду popd вместо pulld. - person Konstantin; 22.03.2018