Per eseguire un comando con una directory di lavoro specifica, di solito si fa
( cd directory && utility )
Le parentesi intorno cd ...
indicano che i comandi in essa contenuti vengono eseguiti in una subshell. La modifica della directory di lavoro in una subshell comporta che la directory di lavoro corrente della shell chiamante non venga modificata, ovvero, dopo aver chiamato questo comando, ci si troverà comunque nella stessa directory da cui è stato avviato.
Esempio:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Questo non può essere trasformato in un alias generico poiché un alias non può accettare alcun argomento.
Per una directory e un'utilità specifiche , si potrebbe fare
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
ma per il caso generale, dovresti usare una funzione shell:
cdrun () {
( cd "$1" && shift && command "$@" )
}
o
cdrun () (
cd "$1" && shift && command "$@"
)
Sostituendo le parentesi graffe con parentesi attorno al corpo della funzione, la funzione viene eseguita nella propria sottostruttura.
Questo sarebbe usato come
$ cdrun "$HOME/somedir" ./script.sh
che eseguirà lo script script.sh
situato nella directory $HOME/somedir
, con $HOME/somedir
come directory di lavoro, o
$ cdrun / ls -l
che ti fornirebbe un elenco di directory in "formato lungo" della directory principale.
La funzione shell prende il suo primo argomento e tenta di passare a quella directory. Se funziona, sposta il nome della directory dai parametri posizionali (l'elenco degli argomenti della riga di comando) ed esegue il comando dato dal resto degli argomenti. command
è un comando integrato nella shell che esegue semplicemente i suoi argomenti come comando.
Tutto ciò è necessario se si desidera eseguire un comando con una directory di lavoro modificata . Se vuoi solo eseguire un comando che si trova altrove, puoi ovviamente usarlo
alias thing='$HOME/somedir/script.sh'
ma ciò sarebbe script.sh
situato nella $HOME/somedir
con la corrente directory come la directory di lavoro.
Un altro modo di eseguire uno script situato altrove senza modificare la directory di lavoro è aggiungere la posizione dello script alla PATH
variabile di ambiente, ad es.
PATH="$PATH:$HOME/somedir"
Ora script.sh
in $HOME/somedir
sarà in grado di essere eseguito da qualsiasi luogo, semplicemente utilizzando
$ script.sh
Ancora una volta, questo non cambia la directory di lavoro per il comando.
cdrun () ( cd "$1" && shift && command "$@" )
.