it-swarm.it

Eseguire un comando specifico in una determinata directory senza eseguirne il cd?

C'è un modo per eseguire un comando in una directory diversa senza dover cd? So che potrei semplicemente cd in e cd out, ma sono solo interessato alle possibilità di rinunciare ai passaggi aggiuntivi :)

43
Naftuli Kay

Non so se questo conta, ma puoi creare una subshell:

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

La directory viene modificata solo per quella subshell, quindi si evita il lavoro di necessità di cd - in seguito.

56
Michael Mrozek

Alcuni programmi hanno opzioni con le quali puoi dire loro di chdir (2) stessi (es. GNU tar 's -C/--directory).

Al di fuori di tali programmi, però, qualcosa dovrà chdir . Si potrebbe scrivere e usare una sorta di programma “binario” compilato invece di farlo fare dalla Shell, ma probabilmente non produrrebbe molto beneficio.

In un commento in un'altra risposta, hai fornito un esempio:

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

Dal momento che il *.log il modello viene espanso dalla stessa Shell (non cp ), qualcosa dovrà chdir alla directory prima che una shell valuti il ​​tuo comando.

Se sei solo interessante nell'evitare di dover "tornare indietro", puoi usare una subshell per isolare l'effetto del cd dall'istanza Shell funzionante .

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

Puoi impacchettarlo in una funzione Shell. (Ho lasciato cadere il -d opzione dal tuo esempio di utilizzo 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
14
Chris Johnsen

Non per minare il valore delle risposte fornite da altre persone, ma credo ciò che vuoi è questo:

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

Nota le parentesi per invocare cd in una sotto-shell.

11
alex

Ecco qualcosa che dovrebbe lasciarti cd indietro dove eri (usando Bash), poiché non dimenticare di farlo sembra essere lo scopo della domanda:

# 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: versione leggermente più corta, grazie a @ Random832)

4
Bruno

Purtroppo, il tuo esempio:

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

non è necessario modificare la directory, perché

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

farebbe lo stesso. Non riesci ad avvicinarti al tuo vero problema? Perché potremmo conoscere una soluzione migliore anche per quello.

Un modo complicato per risolvere il tuo problema, che è lontano dall'eleganza della soluzione Michaels, è l'uso di find, che ha un interruttore '-execdir' da eseguire nella directory, dove viene trovato un file. Adottato male al tuo esempio:

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

Forse è utile per il tuo vero problema. -okdir invece di -execdir ti chiederà di confermare ogni invocazione.

-okdir e -execdir potrebbero aver bisogno dell'installazione di gnu-find, che è generalmente usato su Linux.

2
user unknown

Che ne dite di ./your/path/command.sh?

1
bdictator