Ich weiß nicht, ob das zählt, aber Sie können eine Subshell erstellen:
$ (cd /var/log && cp -- *.log ~/Desktop)
Das Verzeichnis wird nur für diese Subshell geändert, sodass Sie sich die Arbeit sparen müssen, cd -
zu müssen danach.
Einige Programme haben Optionen, mit denen Sie ihnen chdir(2) mitteilen können selbst (z. B. GNU tar ’s -C
/--directory
).
Außerhalb solcher Programme muss jedoch etwas chdir werden . Sie könnten eine Art kompiliertes „binäres“ Programm schreiben und verwenden, anstatt die Shell dies tun zu lassen, aber es würde wahrscheinlich keinen großen Nutzen bringen.
In einem Kommentar in einer anderen Antwort haben Sie ein Beispiel gegeben:
execindirectory -d /var/log "cp *.log ~/Desktop"
Seit *.log
Muster wird von der Shell selbst erweitert (nicht cp ), etwas muss chdir werden in das Verzeichnis, bevor Sie Ihren Befehl von einer Shell auswerten lassen.
Wenn Sie nur daran interessiert sind, „zurück cd“ zu vermeiden, können Sie eine Subshell verwenden, um den Effekt des cd zu isolieren von Ihrer funktionierenden Shell-Instanz.
(cd /path/to/dir && some command)
Sie können dies in eine Shell-Funktion packen. (Ich habe -d
weggelassen Option aus Ihrer Beispielverwendung, 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
Um den Wert der Antworten anderer nicht zu unterminieren, aber ich glaube, Sie wollen dieses:
(cd /path/to && ./executable [ARGS])
Beachten Sie die Klammern zum Aufrufen von cd
in einer Sub-Shell.