【问题标题】:How to comment list of arguments in bash如何在bash中评论参数列表
【发布时间】:2016-07-03 20:55:53
【问题描述】:

如何评论函数的参数列表?我想做这样的事情,这是行不通的:

my_func \
  # This is for something
  arg_1 \
  \
  # This is for something else
  arg_2 \
  \
  # This is not not for anything
  arg_3

这显然行不通。有没有办法实现这样的目标?下一个选项是这样的:

my_func \
  arg_1 \ # This is for something
  arg_2 \ # This is for something else
  arg_3 # This is not not for anything

这在我的书中不太理想,但也不起作用。有什么想法吗?

【问题讨论】:

  • 我认为人们通常会评论函数本身,并可能使用--help 或在不带参数调用函数时打印详细用法。
  • @karakfa 这是一个函数而不是脚本。并且函数有注释,我需要注释的是 args - 为什么我将这个和那个传递给函数。

标签: linux bash shell comments


【解决方案1】:

问题归结为“如何在 bash 中进行内联注释”,技术上正确的答案是您不能。但是,您可以近似内联 cmets,如 this answer 所示。

所以实现它的方法(不是无开销,但它是最接近我想要的东西)是:

my_func \
  arg_1 `# This is for something` \
  arg_2 `# This is for something else` \
  arg_3 # This is not not for anything

或者

my_func \
  `# This is for something` \
  arg_1 \
  \
  `# This is for something else` \
  arg_2 \
  \
  `# This is not not for anything` \
  arg_3

【讨论】:

  • 为什么投反对票?该解决方案完全有效,并且与许多其他问题的公认答案相同。
  • 接受这些答案的人与您一样错误地认为这是否是一个好主意。 (如果您以前看过这个答案,为什么要故意重复发布?)
  • 我认为这“不是一个好主意”,因为它在技术上很昂贵(您为每个评论生成一个无用的过程)。但我认为它比其他解决方案更具可读性,并且性能开销可以忽略不计。如果您阅读了我的答案,您会看到该链接,该链接回答了“如何在 bash 中进行内联评论”这一更普遍的问题。问题本身不重复。
  • @chepner 所以我测试了我的假设(pastebin.com/g5vYcAMv)。通过命令替换使用 1001 个内联 cmets 在我的机器上花费了不到四分之一秒的时间:real 0m0.216s user 0m0.028s sys 0m0.048s
  • 在我的 PC 上的 Cygwin 下通过命令替换使用 1001 内联 cmets 花费了 44 秒。 (不过,我并没有否决这个答案。)
【解决方案2】:

使用命令替换作为假注释既昂贵(您仍然必须派生一个 shell 并解析注释)并且可能很危险(命令替换可以嵌套,并且仍然会执行)。更好的方法是将您的参数存储在一个不会被无意执行的数组中。

args=(
      # This is for something
      arg_1

      # This is for something else
      arg_2

      # This is not not for anything
      arg_3
)

my_func "${args[@]}"

如果您需要保持 POSIX 兼容,即没有数组,我建议在调用之前简单地记录参数:

# Arg 1: this is for something
# Arg 2: this is for something else
# Arg 3: this is not for anything
my_func \
  arg_1 \
  arg_2 \
  arg_3

【讨论】:

  • 感谢您提供更多选择。不幸的是,我们的风格约定禁止使用 bash 数组,并且函数的实际参数数量远多于 3,这使得您的第二个建议不太理想。
  • 数组在 Bash 程序中非常有用,从 2.0 (1997) 版本开始就支持它们。禁止使用它们的样式约定是一个非常糟糕的主意。如果需要可移植的 shell 代码,从问题中删除“bash”标签会很有帮助。
  • 我们是一个小团队,但我们的想法是“如果您需要真正的数据结构,请使用 python”,我非常喜欢这一点。
  • 禁止有用的 Bash 功能可能会导致人们编写不必要的糟糕 Bash 代码,或者花费大量时间将 Bash 代码不必要地转换为 Python。一个更有用的样式约定规则是建议不要使用大量(位置)函数参数。 Bash 函数的局限性通常意味着您要么需要过多的函数参数,要么使用全局变量将数据传递给函数。这些强烈迹象表明 Python 可能是更适合该程序的语言。
【解决方案3】:

这很有效,对性能的影响很小,但并不漂亮:

my_func \
    ${IFS# This is for something } \
    arg_1 \
    \
    ${IFS# This is for something else } \
    arg_2 \
    \
    ${IFS# This is not not for anything } \
    arg_3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2014-08-12
    • 2019-05-06
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多