Wie kann ich einen Befehl in einem Ordner ausführen, ohne das aktuelle Verzeichnis zu ändern?

18

Vielleicht erscheint es Ihnen seltsam, aber ich möchte den Befehl in einem bestimmten Ordner ausführen, ohne den aktuellen Ordner in der Shell zu ändern. Beispiel - das mache ich normalerweise:

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

Obwohl ich so etwas möchte:

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

Ist es möglich?

Timur Fayzrakhmanov
quelle
Können Sie nicht tun ~/.folder/command --key? Muss das commandIhr aktuelles Verzeichnis sein ~/.folder?
Glenn Jackman

Antworten:

44

Wenn Sie die Sekunde vermeiden möchten, cdkönnen Sie verwenden

(cd .folder && command --key)
another_command --key
Florian Diesch
quelle
Sehr schnelle Antwort! Ich kann es nicht einmal akzeptieren, weil das System es mir nicht erlaubt))
Timur Fayzrakhmanov
1
magische Klammer! Wie funktioniert das? +1
genaue
Die Befehle in der Klammer werden in einem neuen Shell-Prozess ausgeführt. Das Ändern des Verzeichnisses, das Festlegen von Umgebungsvariablen usw. in der Klammer wirkt sich nicht auf die übergeordnete Shell aus, in der die anderen Befehle ausgeführt werden.
Florian Diesch
7
Ich würde das ändern , ;um &&für eine gute Maßnahme. Wenn die CD ausfällt (z. B. weil Sie den Verzeichnisnamen eingegeben haben), möchten Sie den Befehl wahrscheinlich nicht ausführen.
Geirha
+1 für @ geirhas Kommentar. Das ist ein sehr wichtiger Punkt. OP, würden Sie eine Bearbeitung in Betracht ziehen?
Jaybee
8

Ohne cd... nicht einmal. Ich habe zwei Wege gefunden:

# 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

und zweitens:

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

Eine einfache Bash-Funktion zum Ausführen eines Befehls in einem bestimmten Verzeichnis:

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

Verwendung:

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

Ich musste dies auf bashfreie Weise tun und war überrascht, dass es kein Hilfsprogramm gibt ( das einem Befehl in einem geänderten Arbeitsverzeichnis ähnelt env(1)oder sudo(1)diesen ausführt. Deshalb habe ich ein einfaches C-Programm geschrieben, das dies tut:

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

Die Verwendung ist wie folgt:

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