No sé si esto cuenta, pero puedes hacer una subcapa:
$ (cd /var/log && cp -- *.log ~/Desktop)
El directorio solo se cambia para esa subcapa, por lo que evita el trabajo de tener que cd -
después.
Algunos programas tienen opciones con las que puedes decirles que chdir(2) ellos mismos (por ejemplo, GNU tar -C
de /--directory
).
Sin embargo, fuera de tales programas, algo tendrá que chdir . Podrías escribir y usar algún tipo de programa "binario" compilado en lugar de que el shell lo haga, pero probablemente no produciría muchos beneficios.
En un comentario en otra respuesta, diste un ejemplo:
execindirectory -d /var/log "cp *.log ~/Desktop"
Desde el *.log
patrón es expandido por el propio shell (no cp ), algo tendrá que chdir al directorio antes de que un shell evalúe su comando.
Si solo está interesado en evitar tener que "retroceder con un cd", entonces puede usar una subcapa para aislar el efecto del cd desde su instancia de shell de trabajo.
(cd /path/to/dir && some command)
Puede empaquetar esto en una función de shell. (Dejé caer el -d
opción de su uso de ejemplo, ya que este comando tiene poco sentido si el directorio es realmente opcional).
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
No quiero socavar el valor de las respuestas dadas por otras personas, pero creo que lo que quieres es esto:
(cd /path/to && ./executable [ARGS])
Tenga en cuenta los paréntesis para invocar cd
en una subcapa.