【问题标题】:Inline comments for Bash?Bash 的内联评论?
【发布时间】:2011-02-01 05:38:00
【问题描述】:

我希望能够在单行命令中注释掉一个标志。 Bash 似乎只有from # till end-of-line cmets。我正在研究以下技巧:

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

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

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

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

【问题讨论】:

标签: bash comments


【解决方案1】:

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

示例未注释代码:

    #!/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

【讨论】:

  • 顺便说一句,如果您将管道字符移动到上一行的末尾,您可以摆脱令人讨厌的反斜杠换行符。
【解决方案2】:

我的首选是:

Commenting in a Bash script

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

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

How to put a line comment for a multi-line command

【讨论】:

  • 注意必须使用反引号,$(#comment) 不起作用。
  • 某些版本会将) 视为评论本身的一部分。 bash 的大部分挑战是由于与旧版本的复古兼容性,一种常见的策略是尽可能使用最旧的解决方案。
  • 注意,这不是一个真正的评论:true && `# comment` && true 是一个有效的表达式。真正的评论会产生类似:syntax error near unexpected token &&'`
  • 你是对的@sebastianwagner,还要注意它会在 OR 短路或类似的情况下失败,但我认为它在不使事情复杂化的情况下已经达到了我们所能达到的水平。对我来说,这表明人们需要一种更好的语言,但它可以做得很好,用这样的“评论”来维护已经构建的代码来记录它。
  • 感谢您的帮助!
【解决方案3】:

为了禁用像 a && b 这样的命令的一部分,我只是在路径上创建了一个空脚本 x,所以我可以执行以下操作:

mvn install && runProject

当我需要构建时,以及

x mvn install && runProject

当不是(使用Ctrl + ACtrl + E移动到开头和结尾)。

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

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

【讨论】:

  • 这样的内置函数已经存在:: 如:string; of; commands; : disabled; enabled;
  • 更好:) 谢谢
  • x: 都是危险的,因为它们会遵守扩展和重定向规则。所以 cmets 的文本可能会被执行,至少是部分执行。这可能会导致各种不良副作用。
  • @bitmask,当然。我认为至少对于x,很明显它将其余部分作为参数,可以评估。
【解决方案4】:

如果您知道变量为空,则可以将其用作注释。当然,如果它不是空的,它会弄乱你的命令。

ls -l ${1# -F 关闭} -a /etc

§ 10.2. Parameter Substitution

【讨论】:

  • 使用${name:=comment} 是安全的。
【解决方案5】:

将其存储在变量中怎么样?

#extraargs=-F
ls -l $extraargs -a /etc

【讨论】:

    【解决方案6】:

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

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

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

    ls -l -a /etc -F
    

    【讨论】:

    • 该死的,我在命令后添加了#,没有一个空格。谢谢!
    【解决方案7】:

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

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

    【讨论】:

    • 为清晰起见投票。不知道为什么这不是第一选择。
    • 但它不是内联的?我想公平地说,需要做 bash 不支持的事情是寻找另一种方式的原因
    【解决方案8】:

    $(: ...) 不那么丑了,但还是不好。

    【讨论】:

    • 通过这种语法,您正在触发一个子 shell,注释应该可以在不改变代码行为的情况下提高可编辑性,但是启动/结束此子 shell 的时间将使您的代码成为较慢(至少可以说),为什么不在新行的开头只使用冒号?
    • 使用 ${IFS#...} 没有调用子 shell。
    • @Rafareino:是的。但说真的,在 95% 的应用程序中,这种开销根本不重要。对于许多重要的情况,首先使用比 Bash 更快的语言可能是一个好主意。
    • ... 麻烦的是,$(: ...) 语法实际上似乎不允许嵌入 cmets:而 echo "foo" `# comment` "bar" 将在第二个反引号处终止注释,假定等效 echo "foo" $(: # comment) "bar" 没有t 解析 # 后面的任何内容。
    • 您可以在$(: ) 中使用单引号或双引号来代替反引号 - 例如:echo "foo" $(: "# comment") "bar" - 不漂亮,但符合要求
    猜你喜欢
    • 2015-03-04
    • 2015-08-01
    • 2014-01-04
    • 2011-10-15
    • 2018-03-28
    • 1970-01-01
    • 2021-08-03
    • 2018-08-17
    • 2012-12-06
    相关资源
    最近更新 更多