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
}
}
Один из хакерских способов - просто написать свои комментарии в качестве аргументов запретной команды. Особенно полезной может быть утилита :
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
.
Обратите внимание, что в любом случае ваш комментарий анализируется оболочкой обычным способом, поэтому, в частности, если у вас есть какие-либо специальные символы, их нужно заключить в кавычки, и поскольку это вывод трассировки, кавычки будут отображаться.
Я постоянно использую 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";
Результаты:
Вместо использования «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
, строка не распечатывается.