Para executar um comando com um diretório de trabalho específico, geralmente é feito
( cd directory && utility )
Os parênteses em torno do cd ...
significam que o (s) comando (s) nele (s) é executado em um subshell. Alterar o diretório de trabalho em um subshell faz com que o diretório de trabalho atual do shell de chamada não seja alterado, ou seja, depois de ter chamado esse comando, você ainda estaria localizado no mesmo diretório em que começou.
Exemplo:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Isso não pode ser transformado em um alias genérico, pois um alias não aceita argumentos.
Para um diretório e utilitário específico , pode-se fazer
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
mas para o caso geral, você teria que usar uma função de shell:
cdrun () {
( cd "$1" && shift && command "$@" )
}
ou
cdrun () (
cd "$1" && shift && command "$@"
)
Substituir as chaves por parênteses ao redor do corpo da função faz com que a função seja executada em sua própria sub-camada.
Isso seria usado como
$ cdrun "$HOME/somedir" ./script.sh
que executaria o script script.sh
localizado no diretório $HOME/somedir
, com $HOME/somedir
como diretório de trabalho ou
$ cdrun / ls -l
que lhe forneceria uma listagem de diretórios em "formato longo" do diretório raiz.
A função shell recebe seu primeiro argumento e tenta mudar para esse diretório. Se isso funcionar, ele desloca o nome do diretório dos parâmetros posicionais (a lista de argumentos da linha de comando) e executa o comando fornecido pelo restante dos argumentos. command
é um comando embutido no shell que simplesmente executa seus argumentos como um comando.
Tudo isso é necessário se você quiser executar um comando com um diretório de trabalho alterado . Se você quer apenas executar um comando localizado em outro lugar, você poderia obviamente usar
alias thing='$HOME/somedir/script.sh'
mas isso executaria script.sh
localizado em $HOME/somedir
com o diretório atual como o diretório de trabalho.
Outra maneira de executar um script localizado em outro lugar sem alterar o diretório de trabalho é adicionar o local do script à sua variável de ambiente PATH
, por exemplo,
PATH="$PATH:$HOME/somedir"
Agora, script.sh
in $HOME/somedir
poderá ser executado em qualquer lugar usando apenas
$ script.sh
Novamente, isso não altera o diretório de trabalho do comando.