Alias para CD em um diretório e chamar um comando

15

Eu tenho um .bash_profile e tenho um conjunto de aliases. Esses aliases no momento 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. Executar um comando desse diretório

Eu não sou um especialista em bash. Alguém poderia me orientar sobre como eu poderia fazer isso?

    
por user232103 19.05.2017 / 08:49

4 respostas

21

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.

    
por 19.05.2017 / 08:59
3
alias <name-of-the-alias>='cd <the-directory> && <command>'

Então, se você quiser mudar o diretório (cd) para a pasta /var/log/ e, em seguida, listar (ls) seus arquivos, você pode acrescentar em seu arquivo .bash_profile o seguinte:

alias logs='cd /var/log/ && ls'
    
por 19.05.2017 / 09:02
1

Eu uso essa 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
}

Esta função age como o ordinário cd se chamado com um único argumento, então você pode chamá-lo de cd . (Esta função não suporta nenhuma opção, mas as opções para cd são raramente usadas.)

    
por 20.05.2017 / 01:49
0

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

alias do_something='cd /tmp; ls'
    
por 19.05.2017 / 09:01

Tags