Rastrear certos parâmetros em algum comando

10

Digamos que eu tenho um comando git branch(sempre com algumas palavras) por exemplo.

O que eu quero é acompanhar quando esse comando é executado com argumentos. Por exemplo, se eu executar o comando git branch developsem erros, desejo salvar developem um arquivo.

Tentei sobrescrever o comando git no meu .bash_profile, algo como isto:

git () {
    if [ $# -eq 3 ]
    then
        git $@
        echo $2 > /path/tacked_parameters.txt
    else
        git $@
    fi
}

Mas parece que não funciona bem. Há alguma maneira de fazer isso?

jherran
fonte
de acordo com o seu exemplo (git branch develop), você deseja verificar se "$ #" é "2" e não "3"? ... (2 parâmetros para a função git)
Olivier Dulac
Foi um erro, mas o código é apenas um exemplo
jherran
Está bem. Acrescentei comentários adicionais abaixo da (boa) resposta de Stephane. minhas observações não pode ser aplicável (penso na .txt como um arquivo de log, mas poderia ser qualquer outra coisa que não pode ter datas nele?)
Olivier Dulac

Respostas:

18

Você tem alguns problemas aqui:

  • sua gitfunção está se chamando recursivamente em vez do gitcomando original .
  • você está usando sem $@aspas, o que não faz nenhum sentido
  • você está deixando outras variáveis ​​sem aspas , pedindo ao shell para dividir + glob elas.
  • você está usando echopara dados arbitrários .
  • você está perdendo o status de saída do gitcomando original .
  • você está substituindo seu arquivo de log em cada chamada.
  • você está colocando definições de função na sua, ~/.bash_profiledestinadas a personalizar sua sessão de login, não o seu shell e normalmente não é lido por bashinvocações que não são de login .

Você gostaria de algo como:

git() {
  if [ "$#" -eq 3 ]
  then
    local ret
    command git "$@"; ret=$?
    printf '%s\n' "$2" >> /path/tacked_parameters.txt
    return "$ret"
  else
    command git "$@"
  fi
}

Isso é:

  • cite suas variáveis,
  • use commandpara executar o git comando ,
  • salve o status de saída gitem variáveis ​​locais e retorne-o na saída,
  • use em >>vez de >redirecionar para o arquivo de log.
  • use em printfvez de echo.
  • e coloque isso no seu ~/.bashrclugar (certifique-se de que você ~/.bash_profileestá fornecendo, ~/.bashrcpois os bashshells de login não são lidos ~/.bashrcpor padrão (um bashbug / falha)). A menos que você queira exportar essa gitfunção (com export -f git) no caso de você também desejar bashscripts que chamam gitpara chamar essa função.
Stéphane Chazelas
fonte
1
Explicação incrível e funciona como um encanto. Muito obrigado.
11125 jherran
+1 para uma resposta muito boa. Mas o op pode precisar mudar o cheque para [ "$#" -eq 2 ], de acordo com seu exemplo. E pode ser uma boa ideia também adicionar a data a "tacked_parameters.txt". E eu iria para o caso geral (ou seja, não apenas rastrear os 2º parâmetros quando 2 parâmetros, mas rastrear quaisquer parâmetros): eu me livraria do if e teria printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (ou seja, mostre o comando + todos os parâmetros (observe que você ainda perde algumas informações, por exemplo, quais os parâmetros possuem intra-separadores, se houver). Data portátil próxima ao padrão iso8601)
Olivier Dulac