¿Cómo puedo ejecutar el comando en una carpeta sin cambiar mi directorio actual?

18

Puede parecerle extraño, pero quiero ejecutar el comando en una carpeta específica sin cambiar la carpeta actual en el shell. Ejemplo: esto es lo que suelo hacer:

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

Aunque quiero algo como esto:

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

¿Es posible?

Timur Fayzrakhmanov
fuente
¿No puedes hacer ~/.folder/command --key? ¿ commandRequiere su directorio actual ~/.folder?
Glenn Jackman

Respuestas:

45

Si quieres evitar el segundo cdpuedes usar

(cd .folder && command --key)
another_command --key
Florian Diesch
fuente
Muy rápida respuesta! Incluso no puedo aceptarlo porque el sistema no me lo permite))
Timur Fayzrakhmanov
1
paréntesis mágico! ¿Cómo funciona? +1
preciso
Los comandos dentro del paréntesis se ejecutan en un nuevo proceso de shell, por lo que cambiar el directorio, establecer variables de entorno, etc. dentro del paréntesis no afecta el shell principal que ejecuta los otros comandos.
Florian Diesch
8
Cambiaría el ;a &&por si acaso. Si el cd falla (por ejemplo, porque escribió el nombre del directorio), probablemente no quiera ejecutar el comando.
geirha
+1 para el comentario de @ geirha. Es un punto realmente importante. OP, ¿considerarías editar?
jaybee
8

Sin cd... Ni una sola vez. Encontré dos maneras:

# 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

y segundo:

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

Una función bash simple para ejecutar un comando en un directorio 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
preguntarse
fuente
0

Tenía la necesidad de hacer esto de una manera libre de bash, y me sorprendió que no haya ninguna utilidad (similar env(1)o sudo(1)que ejecute un comando en un directorio de trabajo modificado. Por lo tanto, escribí un simple programa en C que lo hace:

#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);
}

El uso es así:

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