Comment puis-je exécuter la commande dans un dossier sans y changer mon répertoire actuel?

18

peut-être cela vous semble étrange, mais je veux exécuter la commande dans un dossier spécifique sans changer le dossier actuel dans le shell. Exemple - c'est ce que je fais habituellement:

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

Bien que je veuille quelque chose comme ça:

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

C'est possible?

Timur Fayzrakhmanov
la source
Tu ne peux pas ~/.folder/command --key? Est-ce commandque votre répertoire actuel doit l'être ~/.folder?
glenn jackman

Réponses:

45

Si vous voulez éviter la seconde, cdvous pouvez utiliser

(cd .folder && command --key)
another_command --key
Florian Diesch
la source
Réponse très rapide! Je ne peux même pas l'accepter car le système ne me le permet pas))
Timur Fayzrakhmanov
1
parenthèse magique! Comment ça marche? +1
précis
Les commandes entre parenthèses sont exécutées dans un nouveau processus shell, donc la modification du répertoire, la définition des variables d'environnement, etc. à l'intérieur de la parenthèse n'affectent pas le shell parent qui exécute les autres commandes.
Florian Diesch
8
Je changerais le ;pour &&faire bonne mesure. Si le cd échoue (par exemple parce que vous avez tapé le nom du répertoire), vous ne voudrez probablement pas exécuter la commande.
geirha
+1 pour le commentaire de @ geirha. C'est un point vraiment important. OP, envisageriez-vous de modifier?
jaybee
8

Sans cd... Pas même une fois. J'ai trouvé deux façons:

# 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

et deuxieme:

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

Une fonction bash simple pour exécuter une commande dans un répertoire spécifique:

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

Usage:

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

J'avais besoin de le faire sans bash, et j'ai été surpris qu'il n'y ait pas d'utilitaire (similaire à env(1)ou sudo(1)qui exécute une commande dans un répertoire de travail modifié. J'ai donc écrit un programme C simple qui le fait:

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

L'utilisation est comme ceci:

$ in /path/to/directory command --key
Lucretiel
la source