Elmord's Magic Valley

Computers, languages, and computer languages. Às vezes em Português, sometimes in English.

Evitando morrer nas mãos do gcc

2012-03-04 11:35 -0300. Tags: comp, unix, em-portugues

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).

Comentários / Comments (0)

Deixe um comentário / Leave a comment

Main menu

Recent posts

Recent comments

Tags

em-portugues (213) comp (148) prog (71) in-english (62) life (49) unix (38) pldesign (37) lang (32) random (28) about (28) mind (26) lisp (25) fenius (22) mundane (22) web (20) ramble (18) img (13) rant (12) hel (12) scheme (10) privacy (10) freedom (8) esperanto (7) music (7) lash (7) bash (7) academia (7) copyright (7) home (6) mestrado (6) shell (6) android (5) conlang (5) misc (5) emacs (5) latex (4) editor (4) etymology (4) php (4) worldly (4) book (4) politics (4) network (3) c (3) tour-de-scheme (3) security (3) kbd (3) film (3) wrong (3) cook (2) treta (2) poem (2) physics (2) x11 (2) audio (2) comic (2) lows (2) llvm (2) wm (2) philosophy (2) perl (1) wayland (1) ai (1) german (1) en-esperanto (1) golang (1) translation (1) kindle (1) pointless (1) old-chinese (1)

Elsewhere

Quod vide


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.