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 "$@" )
.{ ... }
para consistência com funções mais longas.pushd
epopd
(também> /dev/null
se você estiver tentando evitar as mensagens de saída), além de manter o contexto limpo!(cd dir && thing)
também é muito mais portátil do que usarpushd
epopd
.Portanto, se você deseja alterar o diretório (cd) para a pasta
/var/log/
e listar (ls) seus arquivos, você pode anexar ao.bash_profile
arquivo o seguinte:fonte
Eu uso essa função para executar um único comando em um diretório diferente:
Uma limitação dessa função é que os curingas são concluídos em relação ao diretório original, não em relação ao diretório em que o comando é executado. É possível fazer melhor no zsh .
Essa função age como o comum
cd
se for chamada com um único argumento; portanto, convém chamá-locd
. (Esta função não suporta nenhuma opção, mas opçõescd
raramente são usadas.)fonte
Separe os comandos com ponto e vírgula, por exemplo:
fonte
cd
falha falhar, você obterá a lista de diretórios do diretório errado. É melhor usar em&&
vez de;
aqui.