使用“set -x”添加注释

使用“set -x”添加注释

有时只需添加确实很方便

set -x

到脚本顶部以在执行之前显示所有命令。

创建具有良好输出的脚本只有一个缺点:我不知道如何以这种方式将文本输出添加到脚本中。如果我使用

echo 'some comment'

这将导致打印加倍:

+ echo 'some comment'
some comment

如果我使用#它根本不会显示。

如何添加像 with 一样打印出来的注释echo?如果我使用set -x

答案1

一种巧妙的方法是将您的注释写为无操作命令的参数。特别有用的可能是:空效用:

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当 shell 尝试运行该行时,该行将作为跟踪输出打印出来,但生成的错误消息将发送到/dev/null.由于很多明显的原因,这很令人讨厌,但就 . 的目的而言,它也被视为错误set -e


请注意,无论哪种情况,您的注释都会由 shell 以普通方式解析,因此特别是如果您有任何特殊字符,则需要将它们加引号,并且由于它是跟踪输出,因此将显示引号。

答案2

不要使用“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

如果您将分配更改为 read DEBUG=0,它将不会打印出该行。

答案3

set -x一直用来调试脚本,并且只找到了解决方案@MichaelHomer 建议它利用了空效用(又名。: ..some comment...)。

当您准备好转向更有效的解决方案时,我建议使用实际的记录器来实现您的脚本,例如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

答案4

您可以使用 null 命令:,它不执行任何操作:

: ::::::: your comment here

注意:请确保不要在评论中使用 bash 特殊字符,否则(, $, !, [, ...这些字符仍会被解释

为了使其更具可读性,您可以+通过设置将 更改为您想要的字符串PS4,例如:

PS4=": "; set -x

相关内容