Como posso executar o comando em uma pasta sem alterar meu diretório atual?

18

Pode parecer estranho para você, mas quero executar o comando em uma pasta específica sem alterar a pasta atual no shell. Exemplo - é o que eu costumo fazer:

~$ cd .folder
~/.folder$ command --key
~/.folder$ cd ..
~$ another_command --key

Embora eu queira algo assim:

~$ .folder command --key
~$ another_command --key

É possível?

Timur Fayzrakhmanov
fonte
Você não pode fazer ~/.folder/command --key? Será que o commandexigir o seu diretório atual para ser ~/.folder?
Glenn Jackman

Respostas:

44

Se você quiser evitar o segundo, cdvocê pode usar

(cd .folder && command --key)
another_command --key
Florian Diesch
fonte
Resposta muito rápida! Eu mesmo não pode aceitá-lo porque o sistema não permite-me))
Timur Fayzrakhmanov
11
parêntese mágico! como isso funciona? +1
preciso
Os comandos entre parênteses são executados em um novo processo de shell, portanto, alterar o diretório, definir variáveis ​​de ambiente etc. dentro dos parênteses não afeta o shell pai que executa os outros comandos.
Florian Diesch 22/01
7
Eu mudaria o ;para &&para uma boa medida. Se o CD falhar (por exemplo, porque você digitou o nome do diretório), provavelmente não deseja executar o comando.
Geirha
+1 no comentário de @ geirha. É um ponto realmente importante. OP, você consideraria editar?
Jaybee
8

Sem cd... Nem uma vez. Eu encontrei duas maneiras:

# Save where you are and cd to other dir
pushd .folder
command --key
# Get back where you were at the beginning.
popd
another_command --key

e em segundo lugar:

find . -maxdepth 1 -type d -name ".folder" -execdir command --key \;
another_command --key
Radu Rădeanu
fonte
1

Uma função simples do bash para executar um comando em diretório específico:

# Run a command in specific directory
run_within_dir() {
    target_dir="$1"
    previous_dir=$(pwd)
    shift
    cd $target_dir && "$@"
    cd $previous_dir
}

Uso:

$ cd ~
$ run_within_dir /tmp ls -l  # change into `/tmp` dir before running `ls -al`
$ pwd  # still at home dir
maravilha
fonte
0

Eu tinha uma necessidade de fazer isso de uma maneira sem bash e fiquei surpreso por não haver utilidade (semelhante env(1)ou sudo(1)que executa um comando em um diretório de trabalho modificado. Então, escrevi um programa C simples que faz isso:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

char ENV_PATH[8192] = "PWD=";

int main(int argc, char** argv) {
    if(argc < 3) {
        fprintf(stderr, "Usage: in <dir> <cmd> [<args>...]\n");
        return 1;
    }

    if(chdir(argv[1])) {
        fprintf(stderr, "Error setting working directory to \"%s\"\n", argv[1]);
        return 2;
    }

    if(!getcwd(ENV_PATH + 4, 8192-4)) {
        fprintf(stderr, "Error getting the full path to the working directory \"%s\"\n", argv[1]);
        return 3;
    }

    if(putenv(ENV_PATH)) {
        fprintf(stderr, "Error setting the environment variable \"%s\"\n", ENV_PATH);
        return 4;
    }

    execvp(argv[2], argv+2);
}

O uso é assim:

$ in /path/to/directory command --key
Lucretiel
fonte