Добавление использования комментариев 'установило-x'

Cred к @Rahul, но измененной версии:

#!/bin/bash

if [[ -z "$1" || ! -f "$1" ]]; then
    printf "Usage: %s <FILE>\n" "$(basename $0)"
    exit 1
fi

c=0
eoli=0
pad=4

while read line
do
        if [[ "$line" = "-" ]]; then
                 (( c++ ))
        elif (( c > 0 )); then
                echo "- $line"
                ! (( --c )) && eoli=1
        elif ((eoli)) && [[ "$line" =~ ^-\  ]]; then
                printf "%-*s%s\n" $pad "" "$line"
        else
                eoli=0
                echo "$line"
        fi
done < "$1"

Используя awk:

#!/usr/bin/awk -f

BEGIN {
    c=0
    eoli=0
    pad=4
};

{
    if (/^-$/) { 
        ++c 
    } else if (c > 0) {
        printf "- %s\n", $0
        eoli = (--c == 0)
    } else if (eoli && /^- /) {
        printf  "%*s%s\n", pad, "", $0
    } else {
        eoli=0
        print $0
    }
}
7
11.07.2014, 00:46
3 ответа

Один из хакерских способов - просто написать свои комментарии в качестве аргументов запретной команды. Особенно полезной может быть утилита : null :

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

приводит к:

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

Команда двоеточия ничего не делает, принимает любые аргументы, которые вы ей задаете, и всегда завершается успешно. Вы получаете лишнее : в начале вывода трассировки, но это, вероятно, не является большой проблемой для ваших целей.

Если вам не нравится : , еще более неприятный трюк - использовать поддельную команду:

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

выведет:

+ seq 1 1
1
+ Some comment
+ true

То есть строку Some comment распечатывается как вывод трассировки, когда оболочка пытается ее запустить, но полученное сообщение об ошибке отправляется на / dev / null . Это неприятно по множеству очевидных причин, но также считается ошибкой для целей set -e .


Обратите внимание, что в любом случае ваш комментарий анализируется оболочкой обычным способом, поэтому, в частности, если у вас есть какие-либо специальные символы, их нужно заключить в кавычки, и поскольку это вывод трассировки, кавычки будут отображаться.

11
27.01.2020, 20:15

Я постоянно использую set -x для отладки скриптов, и нашел только то решение, которое @MichaelHomer предлагает, которое использует нулевую утилиту (также известную как : ...какой-то комментарий...).

Когда вы будете готовы перейти к более мощному решению, я бы предложил реализовать ваши скрипты, используя и реальный логгер, такой как log4Bash.

Пример

#!/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";

Результаты:

ss #1

2
27.01.2020, 20:15

Вместо использования «set -x» для вывода отладочной информации используйте отдельную функцию отладки:

#!/bin/bash

DEBUG=1

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

debug "foo bar"

Выполнение сценария дает

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

Если вы измените назначение на чтение DEBUG = 0 , строка не распечатывается.

3
27.01.2020, 20:15

Теги

Похожие вопросы