有时只需添加确实很方便
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";
结果:
答案4
您可以使用 null 命令:
,它不执行任何操作:
: ::::::: your comment here
注意:请确保不要在评论中使用 bash 特殊字符,否则(, $, !, [, ...
这些字符仍会被解释
为了使其更具可读性,您可以+
通过设置将 更改为您想要的字符串PS4
,例如:
PS4=": "; set -x