Gibt es eine Möglichkeit, einen Befehl in einem anderen Verzeichnis auszuführen, ohne dazu verpflichtet cd
zu sein? Ich weiß, dass ich einfach rein cd
und cd
raus könnte, aber ich bin nur an den Möglichkeiten interessiert, auf die zusätzlichen Schritte zu verzichten :)
linux
bash
cd-command
Naftuli Kay
quelle
quelle
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
. Möglicherweise müssen Sie sich etwas mehr Mühe geben, wenn Sie möchten, dass die Option "Tags" wie-d
und so unterstützt wird.Antworten:
Ich weiß nicht, ob das zählt, aber Sie können eine Unterschale machen:
Das Verzeichnis wird nur für diese Subshell geändert, sodass Sie später keine weiteren Änderungen vornehmen müssen
cd -
.quelle
$ (cd /var/log && cp *.log ~/Desktop)
. Auf diese Weise werden keine weiteren Befehle ausgeführt, wenn das Verzeichnis nicht vorhanden ist.Einige Programme haben Optionen, mit denen Sie chdir (2) selbst mitteilen können (zB GNU tar 's
-C
/--directory
).Außerhalb solcher Programme muss allerdings etwas chdir . Sie könnten ein kompiliertes "Binär" -Programm schreiben und verwenden, anstatt die Shell dazu zu bringen, aber es würde wahrscheinlich keinen großen Nutzen bringen.
In einem Kommentar in einer anderen Antwort gaben Sie ein Beispiel:
Da das
*.log
Muster von der Shell selbst erweitert wird (nicht von cp ), muss etwas in das Verzeichnis chdir , bevor eine Shell Ihren Befehl auswertet.Wenn Sie nur daran interessiert sind, nicht "zurück" schreiben zu müssen, können Sie eine Subshell verwenden, um den Effekt der CD von Ihrer funktionierenden Shell-Instanz zu isolieren .
Sie können dies in eine Shell-Funktion packen. (Ich habe die
-d
Option aus Ihrer Beispielverwendung entfernt, da dieser Befehl wenig Sinn macht, wenn das Verzeichnis tatsächlich optional ist.)quelle
Um den Wert der Antworten anderer nicht zu untergraben, aber ich glaube, Sie möchten Folgendes:
Beachten Sie die Parens, die
cd
in einer Unterschale aufgerufen werden sollen.quelle
Hier ist etwas, das Sie zurücklassen sollte,
cd
wo Sie waren (mit Bash), da es der Zweck der Frage zu sein scheint, dies nicht zu vergessen:(EDIT: etwas kürzere Version, dank @ Random832)
quelle
pushd other-dir
, anstattpushd .; cd other-dir
Dein Beispiel:
braucht keine Änderung am Verzeichnis, weil
würde das gleiche tun. Können Sie Ihrem eigentlichen Problem nicht näher kommen? Weil wir vielleicht auch dafür eine bessere Lösung kennen.
Ein komplizierter Weg, um Ihr Problem zu lösen, der weit von der Eleganz der Michaels-Lösung entfernt ist, ist die Verwendung von find, das einen Schalter '-execdir' hat, der in dem Verzeichnis ausgeführt wird, in dem sich eine Datei befindet. Schlecht in Ihr Beispiel übernommen:
Vielleicht ist es nützlich für Ihr echtes Problem. -okdir anstelle von -execdir fordert Sie auf, jeden Aufruf zu bestätigen.
-okdir und -execdir müssen möglicherweise gnu-find installiert haben, was normalerweise unter Linux verwendet wird.
quelle
Wie wäre es
./your/path/command.sh
?quelle
execindirectory -d /var/log "cp *.log ~/Desktop"
.