Non so se conta, ma puoi creare una subshell:
$ (cd /var/log && cp -- *.log ~/Desktop)
La directory viene cambiata solo per quella subshell, quindi eviti il lavoro di dover cd -
successivamente.
Alcuni programmi hanno opzioni con le quali puoi dire loro di chdir(2) stessi (ad esempio GNU tar -C
di /--directory
).
Al di fuori di tali programmi, però, qualcosa dovrà essere chdir . Potresti scrivere e usare una sorta di programma "binario" compilato invece di farlo fare alla shell, ma probabilmente non darebbe molti benefici.
In un commento in un'altra risposta, hai fornito un esempio:
execindirectory -d /var/log "cp *.log ~/Desktop"
Dal *.log
pattern viene espanso dalla shell stessa (non da cp ), qualcosa dovrà chdir alla directory prima che una shell valuti il tuo comando.
Se sei solo interessato a evitare di dover "cd back", allora puoi usare una subshell per isolare l'effetto del cd dalla tua istanza di shell funzionante.
(cd /path/to/dir && some command)
Puoi impacchettarlo in una funzione di shell. (Ho eliminato il -d
option dal tuo utilizzo di esempio poiché non ha molto senso questo comando se la directory è effettivamente facoltativa.)
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
Non per minare il valore delle risposte fornite da altre persone, ma credo che quello che vuoi sia questo:
(cd /path/to && ./executable [ARGS])
Nota le parentesi per richiamare cd
in una sotto-shell.