
Eu tenho um .bash_profile
e 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.
- CD em um diretório
- 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.sh
localizado no diretório $HOME/somedir
, $HOME/somedir
sendo 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.sh
localizado $HOME/somedir
com 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 PATH
variável de ambiente, por exemplo
PATH="$PATH:$HOME/somedir"
Agora script.sh
poderá $HOME/somedir
ser 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_profile
arquivo 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 cd
se 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 cd
raramente são usadas.)
Responder4
Separe os comandos com ponto e vírgula, por exemplo:
alias do_something='cd /tmp; ls'