Para executar um comando com um diretório de trabalho específico, geralmente é necessário
( cd directory && utility )
Os parênteses ao redor do cd ...
meio significa que o (s) comando (s) é executado em um subshell. A alteração do 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 chamar este comando, você ainda estaria localizado no mesmo diretório em que iniciou.
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 pode receber nenhum argumento.
Para um diretório e utilitário específicos , pode-se fazer
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
mas para o caso geral, você precisaria usar uma função shell:
cdrun () {
( cd "$1" && shift && command "$@" )
}
ou
cdrun () (
cd "$1" && shift && command "$@"
)
Substituir os chavetas entre parênteses ao redor do corpo da função faz com que a função seja executada em seu próprio subshell.
Isso seria usado como
$ cdrun "$HOME/somedir" ./script.sh
que executaria o script script.sh
localizado no diretório $HOME/somedir
, com $HOME/somedir
o diretório de trabalho ou
$ cdrun / ls -l
que forneceria uma listagem de diretório em "formato longo" do diretório raiz.
A função shell pega seu primeiro argumento e tenta mudar para esse diretório. Se isso funcionar, ele desativa o nome do diretório dos parâmetros posicionais (a lista de argumentos da linha de comandos) e executa o comando fornecido pelo restante dos argumentos. command
é um comando interno no shell que simplesmente executa seus argumentos como um comando.
Tudo isso é necessário se você deseja executar um comando com um diretório de trabalho alterado . Se você quiser apenas executar um comando localizado em outro lugar, obviamente poderá usar
alias thing='$HOME/somedir/script.sh'
mas isso seria executado script.sh
localizado no $HOME/somedir
com o atual diretório 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 PATH
variável de ambiente, por exemplo
PATH="$PATH:$HOME/somedir"
O Now 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.
cdrun () ( cd "$1" && shift && command "$@" )
.