带管道的多行 bash 命令中单独行的可读注释?

带管道的多行 bash 命令中单独行的可读注释?

使用管道创建 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
}

相关内容