Existe algum sistema parecido com hook para shell?

3

Notei que gosto de executar determinadas ações em uma ordem específica.

Um gancho, como eu vejo, é basicamente "fazer algo após o evento", onde event, poderia ser qualquer comando com parâmetros, como git clone , git submodule add , cd , rm ou qualquer outro .

Gostaria de dizer "se git add , git status ". Por exemplo, eu sempre: git add X; git status e cd X; ls -la , e posso pensar em muitas outras combinações como essa, que gostaria de automatizar em meu fluxo de trabalho.

Existem 3 motivos pelos quais os aliases \ funções não funcionarão facilmente aqui:

  1. A principal razão que eu acho que não pode ser facilmente feita é que eu tenho várias definições de função e não encontrei uma maneira de sobrescrever as funções existentes enquanto ainda ser capaz de usá-los.

Vou ilustrar o que quero dizer com um exemplo: eu uso alguns scripts zsh de Nathan Broadbent chamados SCM Breeze - os scripts adicione uma função git () que faz coisas.

Suponha agora que desejo automatizar meu fluxo de trabalho e fazer com que, após cada git clone , exista um cd no diretório criado pelo comando anterior ( Veja como fazer isso ). Para fazer isso, usarei uma função git (), certo?

Essa função substituirá o comando SCM Breeze e não poderei usar o SCM Breeze.

  1. Os aliases exigem que eu lembre das coisas. Eu quero que isso aconteça automaticamente.
  2. Não é fácil manter - tentei substituir manualmente cada comando, mas mudar as coisas é muito complicado, e não me vejo fazendo isso para todas as combinações que consigo imaginar devido à complexidade.

Eu uso ZSH com OhMyZsh, se isso ajuda.

Agora, estou fazendo isso com scripts bash (aliases e funções), mas parece que estou fazendo um trabalho muito provavelmente feito por outra pessoa até agora. Alguém familier com um projeto que faz isso? ajudar a facilitar "ganchos" de uma forma arrumada?

    
por Cat Boss 26.11.2013 / 08:31

2 respostas

4

Coisas que podem ajudar você:

A função preexec hook é chamada antes de cada linha de comando ser executada (não antes de cada comando).

preexec() echo will execute: $1

precmd antes de cada solicitação.

precmd() echo executed: $history[$[HISTCMD-1]]

Você pode estender uma função assim:

functions[git]='
  (){ '$functions[git]'; } "$@"; local myret=$?
  do-extra-stuff
  return $myret'

Ou:

functions[git-old]=$functions[git]
git() {
  git-old "$@"
  local myret=$?
  do-extra-stuff || return $myret
}

O DEBUG trap é executado após cada comando:

trap 'echo $ZSH_DEBUG_CMD returned with $?' DEBUG

Você pode redefinir o widget accept-line (mapeado para Enter ) para fazer coisas lá:

accept-line() {
  zle -R "going to run: $BUFFER"
  sleep 1
  zle .$WIDGET
}

zle -N accept-line
    
por 26.11.2013 / 13:55
2

Não há nenhuma facilidade que eu saiba que aja de uma maneira similar ao que você está descrevendo. Existe, no entanto, a capacidade de criar um apelido ou função dentro do Bash que possa facilitar o que você quer, o que soa similar ao que você está descrevendo

Exemplos

como funções

$ function mygadd() { git add "$@"; }
$ function mcd() { cd "@"; ls -la; }

como aliases

$ alias mycmd='cmd1; cmd2;'

OBSERVAÇÃO: Com aliases você não pode passar parâmetros posicionais. Você pode pseudo passar argumentos incluindo-os na chamada para o alias que será expandido como uma única linha de comando pelo shell.

Exemplo

$ alias somecmd='ls -la'
$ somecmd dir1 dir2 

O texto acima invocará ls -la dir1 dir2 , mas esses 2 argumentos nunca foram passados para o alias, mas o alias foi expandido para ls -la dir1 dir2 quando a linha de comando foi avaliada e executada.

Ambos podem ser incorporados em seus arquivos $HOME/.bashrc config para que sejam carregados sempre que você fizer login.

    
por 26.11.2013 / 09:45

Tags