Há um tempo atrás, em um momento de distração, dei um comando do tipo:
$ gcc -o h[Tab] h[Tab]
que os tabs completaram para:
$ gcc -o hello.c hello.c
Em situações normais, o gcc compila fonte e o sobrescreve com o executável nesse caso, o que definitivamente não é o que eu queria e me faria ter perdido umas boas linhas de código. Para minha surpresa, entretanto, a máquina pareceu ter criado consciência própria e me respondeu:
$ gcc -o hello.c hello.c gcc -o hello.c? $ _
Levei alguns segundos para entender o que estava acontecendo.
Meu eu do passado é um cara muito legal.
Mais ou menos um ano antes, eu tinha adicionado as seguintes linhas ao meu /etc/bash.bashrc:
# Preventing chaos. gcc() { local args=("$@") out="" while [[ $# -gt 0 ]]; do case "$1" in -o) out="$2" ;; -o*) out="${1#-o}" ;; esac shift done if [[ $out == *.c ]]; then echo "gcc -o $out?" >&2 return 1 else command gcc "${args[@]}" fi }
Essa rica função intercepta as chamadas ao gcc e, se o argumento da opção -o tiver a extensão .c, impede que o gcc seja executado. Também seria possível escrever um script independente ao invés de uma função, colocando-o em algum lugar antes do gcc real no PATH (e.g., /usr/local/bin/gcc), com o conteúdo da função (o trecho entre chaves), substituindo o command gcc pelo caminho do gcc real (e.g., /usr/bin/gcc) e o return por exit. Porém, a função tem a vantagem de afetar apenas shells interativos, deixando em paz scripts, Makefiles e afins.
De brinde, você pode aproveitar para adicionar -Wall automaticamente à linha de comando do gcc (o que teria me economizado mais de oito mil horas de debugging durante a vida).
Copyright © 2010-2024 Vítor De Araújo
O conteúdo deste blog, a menos que de outra forma especificado, pode ser utilizado segundo os termos da licença Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International.
Powered by Blognir.