使用管道创建 shell 脚本并使用反斜杠继续行时,我想插入注释在不同的行上,以健壮、可读和便携的方式。
例如,给出这个未注释的多行命令(为了清晰起见,从@DigitalRoss 窃取):
echo abc |
tr a-z A-Z |
sort |
uniq
...下面的内容在美学上最接近我想要完成的目标,但由于显而易见的原因,不起作用...是的,我很清楚这通常不值得评论:
# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
# Convert lowercase to uppercase.
tr a-z A-Z |
# Sort the results.
sort |
# Only show unique lines.
uniq
现有的相关答案似乎令我不满意, 如下:
第一的,格伦·杰克曼的回答(向数组添加参数,然后执行数组)适用于单个命令,但不适用于管道(即使可以,它也会增加我想避免的复杂性)。
第二,@Gilles 的回答在这里(使用:
)似乎也不适用于管道,因为它改变了管道的流程:
$ echo "abc" | :
$
(笔记:如果有一个相当于:
不加修改地传递输出的东西,那在美学上是可以接受的,但我还没有找到一个。我可以编写一个自定义的,但这会降低可移植性。)
最后,最后一部分DigitalRoss 在 StackOverflow 上的回答在同一行添加注释效果很好,但我强烈喜欢在单独的行上添加注释。否则,当行的长度变化很大时,可读性就会降低:
echo abc | # normal comment OK here`
/usr/local/bin/really/long/path/ridiculously-long-filename.sh | # another normal comment OK here
sort | # the pipelines are automatically continued
uniq # final comment
我正在寻找保持可读性并最大限度地减少复杂性的答案,或者寻找一些关于为什么我正在寻找的东西不可行的背景。
答案1
这个怎么样?
echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \
# Sort the results.
sort | \
# Only show unique lines.
uniq
(反斜杠需要用作最后一个字符在这些行中。)我不确定该方法的可移植性,但它确实适用于当前的bash
.
答案2
这有点愚蠢且低效,但它确实有效,而且它适用于|
-first 风格。
# Add a comment to a pipeline, old-school BASIC-style
function REM {
cat
}
cmd1 \
| REM "comment on cmd2" \
| cmd2 \
| REM "comment on cmd3" \
| cmd3
也就是说,如果我在生产代码中看到它,我可能会不高兴,并对编写它的人大喊大叫,所以使用,呃,慎用。
更严重的是,块怎么样{}
?
cmd1 \
| {
# comment on cmd2
cmd2
} \
| {
# comment on cmd3
cmd3
}