Adicionando comentários usando 'set -x'

5

Às vezes é muito útil apenas adicionar

set -x

no topo do seu script para mostrar todos os comandos antes de serem executados.

Há apenas uma desvantagem na criação de scripts com uma saída aceitável: não sei como adicionar saída de texto ao script dessa maneira. Se eu usar

echo 'some comment'

resultará na impressão duplicada:

+ echo 'some comment'
some comment

E se eu usar # , ele não será exibido.

Como posso adicionar comentários impressos como echo ? Se eu usar set -x ?

    
por rubo77 09.07.2014 / 11:54

3 respostas

9

Uma maneira hacky é apenas escrever seus comentários como argumentos em um comando no-op. Particularmente útil pode ser o utilitário : null :

set -x
: Some interesting notes on the following are ...

resulta em:

+ : Some interesting notes on the following are...

O comando de dois-pontos não faz nada, aceita os argumentos que você fornece e sempre é bem-sucedido. Você recebe um : extra no início da saída do seu rastreio, mas isso provavelmente não é um grande problema para o seu propósito.

Se você não gosta do : , um truque ainda mais desagradável é usar um comando falso:

set -x
seq 1 1
Some comment &>/dev/null
true

produzirá:

+ seq 1 1
1
+ Some comment
+ true

Ou seja, a linha Some comment é impressa como saída de rastreio quando o shell tenta executá-la, mas a mensagem de erro resultante é enviada para /dev/null . Isso é desagradável por vários motivos óbvios, mas também é considerado um erro para os propósitos de set -e .

Note que, em ambos os casos, seu comentário é analisado pelo shell de maneira ordinária, então, em particular, se você tiver algum caracter especial, ele precisa ser citado e, como sua saída de rastreio, o texto será exibido.

    
por 09.07.2014 / 12:18
3

Em vez de usar "set -x" para imprimir as informações de depuração, use uma função de depuração separada:

#!/bin/bash

DEBUG=1

debug() {
    if [ $DEBUG == 1 ]
    then
    echo "DEBUG:" $@
    fi
}

debug "foo bar"

A execução do script produz

temeraire:ul jenny$ ./testdebug.sh 
DEBUG: foo bar

Se você alterar a atribuição para ler DEBUG=0 , ela não imprimirá a linha.

    
por 09.07.2014 / 12:33
2

Eu uso set -x para depurar scripts o tempo todo e só encontrei a solução que @MichaelHomer sugere que faz uso do utilitário null (também conhecido como : .. algum comentário ... ).

Quando você estiver pronto para migrar para uma solução mais potente, sugiro implementar seus scripts usando um criador de logs real, como log4Bash .

Exemplo

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

Resultados:

    
por 09.07.2014 / 14:36