Alias ​​para CD em um diretório e chame um comando

Alias ​​para CD em um diretório e chame um comando

Eu tenho um .bash_profilee nisso tenho um conjunto de aliases. No momento, esses aliases executam apenas um único comando e foi bastante fácil. No entanto, gostaria de fazer duas coisas com um novo alias que estou tentando criar.

  1. CD em um diretório
  2. Execute um comando desse diretório

Responder1

Para executar um comando com um diretório de trabalho específico, normalmente faz-se

( cd directory && utility )

Os parênteses ao redor cd ...significam que o(s) comando(s) nele contido(s) são executados 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, após ter chamado este comando, você ainda estaria localizado no mesmo diretório onde 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 aceitar nenhum argumento.

Paraespecíficodiretório e utilitário, pode-se fazer

alias cdrun='( cd "$HOME/somedir" && ./script.sh )'

mas para o caso geral, você teria que usar uma função 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 seu próprio subshell.

Isso seria usado como

$ cdrun "$HOME/somedir" ./script.sh

que executaria o script script.shlocalizado no diretório $HOME/somedir, $HOME/somedirsendo o diretório de trabalho, ou

$ cdrun / ls -l

o que forneceria uma listagem de diretórios em "formato longo" do diretório raiz.

A função shell pega seu primeiro argumento e tenta mudar para esse diretório. Se funcionar, ele desvia 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ê deseja executar um comandocom um diretório de trabalho alterado. Se você quiser apenas executar um comando localizado em outro lugar, obviamente você poderia usar

alias thing='$HOME/somedir/script.sh'

mas isso funcionaria script.shlocalizado $HOME/somedircom oatualdiretó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 a localização do script à sua PATHvariável de ambiente, por exemplo

PATH="$PATH:$HOME/somedir"

Agora script.shpoderá $HOME/somedirser executado de qualquer lugar apenas usando

$ script.sh

Novamente, isso faznãoaltere o diretório de trabalho do comando.

Responder2

alias <name-of-the-alias>='cd <the-directory> && <command>'

Portanto, se você deseja alterar o diretório (cd) para a pasta /var/log/e depois listar (ls) seus arquivos, você pode anexar ao seu .bash_profilearquivo o seguinte:

alias logs='cd /var/log/ && ls'

Responder3

Eu uso esta função para executar um único comando em um diretório diferente:

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

Uma limitação desta função é que os curingas são preenchidos em relação ao diretório original, e não em relação ao diretório onde o comando é executado.É possível fazer melhor no zsh.

Esta função age como uma função comum cdse for chamada com um único argumento, então você pode querer chamá-la cd. (Esta função não suporta nenhuma opção, mas as opções cdraramente são usadas.)

Responder4

Separe os comandos com ponto e vírgula, por exemplo:

alias do_something='cd /tmp; ls'

informação relacionada