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:
execindirectory -d /var/log "cp *.log ~/Desktop"
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 .
(cd /path/to/dir && some command)
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.)
runindir() { (cd "$1" && shift && eval "$@"); }
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
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.