Como o Bash pode executar um comando em um contexto de diretório diferente?

96

Eu tenho um comando comum que é chamado de diretórios muito específicos. Existe apenas um executável em / bin para este programa, e o diretório de trabalho atual é muito importante para executá-lo corretamente. O script afeta os arquivos que residem no diretório em que é executado.

Agora, eu também tenho um script de shell personalizado que faz algumas coisas em um diretório, mas preciso chamar o comando mencionado acima como se estivesse em outro diretório.

Como você faz isso em um script de shell?

Marty Wallace
fonte

Respostas:

39

Você pode usar o cdbuiltin ou o builtins pushde popdpara essa finalidade. Por exemplo:

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

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

Você usa os builtins como qualquer outro comando e pode alterar o contexto do diretório quantas vezes quiser em um script.

Todd A. Jacobs
fonte
4
Também existe cd -um shell POSIX para voltar ao diretório anterior. Dito isso, (a) pushde popdsão realmente destinados ao uso interativo e (b) nem sempre é seguro supor que você pode cdvoltar ao ponto de partida, especialmente em subsistemas complexos que podem usar permissões restritivas internamente (consulte stackoverflow.com/questions/ 10555284 /… ).
geekosaur
3
Usar um subshell é uma solução muito melhor
josh123a123
Para scripts, um subshell é provavelmente uma ideia melhor. No entanto, estou muito feliz em aprender sobre popd.
conorbode
Você pode explicar o que o :símbolo significa aqui?
Vadim Kotov
2
@VadimKotov Acho que é efetivamente um ambiente autônomo. Seção relevante de man bashleituras: : [arguments]Sem efeito; o comando não faz nada além de expandir argumentos e executar qualquer redirecionamento especificado. O status de retorno é zero.
menino de
225

Use cdem um subshell; a maneira abreviada de usar esse tipo de subcamada são os parênteses.

(cd wherever; mycommand ...)

Dito isso, se o seu comando tem um ambiente de que necessita, ele deve realmente garantir esse ambiente em vez de colocar o ônus sobre qualquer coisa que queira usá-lo (a menos que seja um comando interno usado em circunstâncias muito específicas no contexto de um poço sistema definido maior, de forma que qualquer chamador já precisa garantir o ambiente de que necessita). Normalmente, isso seria algum tipo de wrapper de script de shell.

geekosaur
fonte
Você também pode inserir um \após cada um ;para comandos de várias linhas dentro do mesmo contexto.
Chiramisu
Tigre agachado, melhor resposta oculta
usuário
37
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
bmargulies
fonte
20

Se você deseja retornar ao seu diretório de trabalho atual:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Estamos definindo uma variável current_dirigual a suapwd
  2. depois disso, iremos cdpara onde você precisa executar seu comando
  3. então estamos executando o comando
  4. então vamos cdvoltar para a nossa variávelcurrent_dir

Outra solução por @apieceofbart pushd && YOUR COMMAND && popd

abc123
fonte
4
ou você pode fazerpushd && YOUR COMMAND && pulld
apieceofbart de
4
@apieceofbart Acho que você quis dizer em popdvez de pulld.
Konstantin,