it-swarm.com.de

Einen bestimmten Befehl in einem bestimmten Verzeichnis ausführen, ohne darauf zuzugreifen?

Gibt es eine Möglichkeit, einen Befehl in einem anderen Verzeichnis auszuführen, ohne cd dazu zu müssen? Ich weiß, dass ich einfach cd rein und cd raus kann, aber ich bin nur an den Möglichkeiten interessiert, auf die zusätzlichen Schritte zu verzichten :)

43
Naftuli Kay

Ich weiß nicht, ob dies zählt, aber Sie können eine Unterschale erstellen:

$ (cd /var/log && cp -- *.log ~/Desktop)

Das Verzeichnis wird nur für diese Subshell geändert, sodass Sie nicht mehr cd - danach.

56
Michael Mrozek

Einige Programme haben Optionen, mit denen Sie ihnen sagen können, dass sie chdir (2) sich selbst (z. B. GNU tar = 's -C/--directory).

Außerhalb solcher Programme muss jedoch etwas chdir. Sie könnten eine Art kompiliertes "binäres" Programm schreiben und verwenden, anstatt es von der Shell ausführen zu lassen, aber es würde wahrscheinlich nicht viel Nutzen bringen.

In einem Kommentar in einer anderen Antwort haben Sie ein Beispiel gegeben:

execindirectory -d /var/log "cp *.log ~/Desktop"

Da das *.log - Muster von der Shell selbst erweitert wird (nicht cp), muss etwas chdir in das Verzeichnis, bevor eine Shell vorhanden ist Bewerten Sie Ihren Befehl.

Wenn Sie nur daran interessiert sind, das Zurückschalten zu vermeiden, können Sie eine Unterschale verwenden, um den Effekt von cd von Ihrer funktionierenden Shell-Instanz zu isolieren.

(cd /path/to/dir && some command)

Sie können dies in eine Shell-Funktion packen. (Ich habe die Option -d Aus Ihrer Beispielverwendung entfernt, da dieser Befehl wenig Sinn macht, wenn das Verzeichnis tatsächlich optional ist.)

runindir() { (cd "$1" && shift && eval "[email protected]"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first
14
Chris Johnsen

Nicht um den Wert der Antworten anderer Leute zu untergraben, aber ich glaube, was Sie wollen ist das :

(cd /path/to && ./executable [ARGS])

Beachten Sie die Parens, die cd in einer Sub-Shell aufrufen sollen.

11
alex

Hier ist etwas, das Sie cd dorthin zurücklassen sollte, wo Sie waren (mit Bash), da es der Zweck der Frage zu sein scheint, dies nicht zu vergessen:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(EDIT: etwas kürzere Version dank @ Random832)

4
Bruno

Leider Ihr Beispiel:

execindirectory -d /var/log "cp *.log ~/Desktop"

braucht keine Änderung am Verzeichnis, weil

cp /var/log/*.log ~/Desktop

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.

Eine komplizierte Methode zur Lösung Ihres Problems, die weit von der Eleganz der Michaels-Lösung entfernt ist, ist die Verwendung von find, bei der ein Schalter '-execdir' in dem Verzeichnis ausgeführt wird, in dem eine Datei gefunden wird. Schlecht auf Ihr Beispiel übernommen:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

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 benötigen möglicherweise gnu-find, um installiert zu werden, was normalerweise unter Linux verwendet wird.

2
user unknown

Wie wäre es mit ./your/path/command.sh?

1
bdictator