对Bash的嵌入式评论?


142

我希望能够在单行命令中注释掉单个标志。Bash似乎只有from # till end-of-line意见。我正在看一些技巧:

ls -l $([ ] && -F is turned off) -a /etc

这很丑,但总比没有好。有没有更好的办法?

以下内容似乎可行,但我不确定它是否可移植:

ls -l `# -F is turned off` -a /etc

#comment技巧也这里提到:stackoverflow.com/questions/9522631/...
尤哈Palomäki

1
在@JuhaPalomäki提到的链接之后,@ ${IFS#comment}pjh在评论中引入了这个奇妙的技巧。没有子外壳程序被调用。
Alexis

Answers:


110

我的首选是:

在Bash脚本中评论

这会有一些开销,但是从技术上讲,它确实可以回答您的问题

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

特别是对于管道,有一个更清洁的解决方案,没有任何开销

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

如何为多行命令添加行注释


3
请注意,您必须使用反引号,$(#comment)但不起作用。
funroll

1
某些版本会将视为)注释本身的一部分。bash面临的大多数挑战是由于与旧版本的复古兼容性,一种常见的策略是使用最旧的解决方案。
Rafareino

2
注意,这不是真正的注释:true && `# comment` && true是有效的表达式。真正的评论将产生如下内容:syntax error near unexpected token &&'`
Sebastian Wagner,

您是正确的@sebastianwagner,还请注意,它将在OR短路或类似情况下发生故障,但是我认为在不使事情复杂化的前提下,它可以满足我们的要求。对我来说,这标志着人们需要一种更好的语言,但这可以做得很好,用这样的“注释”维护已经构建的代码,以对其进行记录。
Rafareino

谢谢那帮助了我!
xiarnousx

58

我发现复制行并注释掉原始版本是最简单(也是最易读)的:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

为了清晰起见,请投票支持。不知道为什么这不是首选。
David Tabernero M.

但是那不是内联的吗?我想公平地说,需要做bash不支持的事情导致找到另一种方式
ThorSummoner18年

25

$(: ...) 有点丑陋,但还是不好。


2
通过这种语法,您将触发一个子shell,可以通过注释来改善可扩展性,而根本不改变代码的行为,但是启动/结束该子shell的时间会使您的代码变慢(至少可以这样说),为什么不在新行的开头仅使用冒号?
拉法雷诺2014年

1
使用$ {IFS#...}不会调用任何子外壳。
Alexis

3
@Rafareino:是的。但严重的是,在95%的应用程序中,这些开销根本没有关系。对于许多确实很重要的情况,首先使用比Bash更快的语言可能是个好主意。
大约

麻烦的是,该$(: ...)语法实际上似乎不允许嵌入注释:虽然echo "foo" `# comment` "bar"将在第二个反引号处终止注释,但是假定的等效项echo "foo" $(: # comment) "bar"不会解析#。之后的任何内容。
大约


4

这是我在多个管道命令之间进行内联注释的解决方案。

示例未注释的代码:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

管道注释的解决方案(使用辅助函数):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

或者,如果您愿意,这是不带帮助器功能的相同解决方案,但是有点麻烦:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

7
顺便说一句,如果将管道字符移动到上一行的末尾,则可以摆脱讨厌的反斜杠换行符。
tripleee

3

大多数命令允许args以任何顺序出现。只需将注释的标志移到该行的末尾即可:

ls -l -a /etc # -F is turned off

然后重新打开它,只需取消注释并删除文本即可:

ls -l -a /etc -F

1
该死的,我#在命令后添加了一个空格。谢谢!
ASGS


1

为了禁用部分命令,例如a && b,我只是创建了一个空脚本x,该脚本位于路径上,因此我可以执行以下操作:

mvn install && runProject

当我需要建造时,以及

x mvn install && runProject

不使用时(使用Ctrl + ACtrl + E移至起点和终点)。

如评论中所述,另一种方法是内置Bash :而不是x

$  : Hello world, how are you? && echo "Fine."
Fine.

2
这样的内置对象已经存在::如:string; of; commands; : disabled; enabled;
xenithorb

甚至更好:)谢谢
OndraŽižka18年

-1

如果评论值得提出,它可能会放在行尾,也可以单独一行。我很少发现在任何语言的注释前后都需要带有代码的行内注释。

哦,有一个例外,这是我通常使用的SQL方言,它使用'{comments}'。有时,我会写:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

但是,即使如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.