Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何为多行命令放置行注释_Bash_Shell_Comments - Fatal编程技术网

Bash 如何为多行命令放置行注释

Bash 如何为多行命令放置行注释,bash,shell,comments,Bash,Shell,Comments,我知道如何在Bash脚本中编写多行命令,但如何为多行命令中的每一行添加注释 CommandName InputFiles \ # This is the comment for the 1st line --option1 arg1 \ # This is the comment for the 2nd line --option2 arg2 # This is the comment for the 3nd line 但不幸的

我知道如何在Bash脚本中编写多行命令,但如何为多行命令中的每一行添加注释

CommandName InputFiles      \ # This is the comment for the 1st line
            --option1 arg1  \ # This is the comment for the 2nd line
            --option2 arg2    # This is the comment for the 3nd line

但不幸的是,continuation character\之后的注释将中断命令。

您可以将参数存储在数组中:

args=(InputFiles      # This is the comment for the 1st line
      # You can have whole lines of comments in between, useful for:
      #--deprecated-option # This isn't use any more
      --option1 arg1  # This is the comment for the 2nd line

      # And even blank lines in between for readability
      --option2 arg2  # This is the comment for the 3nd line
     )
CommandName "${args[@]}"

不过,如果只是为了允许对每个参数进行注释,我认为这看起来有点不太妥当。因此,我只需重写注释,使其引用单个参数,并将其置于整个命令之上。

我担心,一般来说,您无法满足您的要求。最好是在命令前的行上添加注释,或在命令行末尾添加一条注释,或在命令后添加注释


您无法以这种方式在命令中散布注释。\s表示合并行的意图,因此出于所有意图和目的,您都试图将注释散布在一行中,这无论如何都不起作用,因为a必须位于行的末尾才能产生这种效果。

我就是这样做的。基本上,通过使用Bash的backtick,可以将这些注释放置在长命令行的任意位置,即使它是跨行分割的。我已将echo命令放在您的示例前面,以便您可以执行示例并了解其工作原理:

echo CommandName InputFiles `#1st comment` \
             --option1 arg1 `#2nd comment` \
             --option2 arg2 `#3rd comment`
另一个示例,您可以在一行的不同位置放置多个注释:

some_cmd --opt1 `#1st comment` --opt2 `#2nd comment` --opt3 `#3rd comment`
根据pjh对的注释,将IFS替换为已知不包含非空白字符的变量

comment=
who ${comment# This is the command} \
    -u ${comment# This is the argument}
为什么不引用参数展开式?使用空字符串初始化变量。当参数展开时,与shell注释字符无关但用于相似性的运算符将尝试从参数值中删除实际注释。当然,结果仍然是一个空字符串

未加引号的参数展开将进行分词和路径名生成。在这种情况下,两个进程都不会从空字符串中创建任何其他单词,因此结果仍然是空字符串。这样的空字符串被简单地丢弃,而不影响它出现的命令。上述情况正好相当于

who \
  -u


这对OP的例子这样简单的东西有效,但是它不支持>和@Philipp-Hmmm,谢谢。这是一个很好的解决办法。但是,如果我的-option arg同时包含“and”,恐怕会有点混乱。@Peterley:您也可以在数组中使用“and”。更简单的方法是将参数存储在数组中,然后像这样使用它们:CommandName${args[@]}。如果您希望能够注释掉参数列表中的整行,则此格式优于所有其他格式。命令${args[@]}ftw。它甚至可以在管道子命令中工作:echo`1`foo\newline | perl-ne`2`'print'。。。正是我需要的!这是我见过的最巧妙的替代滥用!这种技术为每个内联注释创建一个子shell,因此这些注释非常昂贵。它们只适用于不经常执行的行。这些注释非常昂贵,因为它们每个都创建一个子shell。这使得该技术在某些情况下无法使用。使用相同基本思想的一个更便宜、但可读性较差的替代方案是:echo CommandName InputFiles${IFS 1st comment}-option1 arg1${IFS 2nd comment}-option2 arg2${IFS 3rd comment}。有趣的是,它仅适用于反勾号,而不适用于使用$的命令替换。有什么原因吗?如果更新代码,请将代码块复制到相邻的注释/注释块。注意:此问题及其解决方案也适用于多行字符串。仅供参考,这不是链接问题的重复,而是询问有关使用管道的命令。。。vs这个问题讨论的是一个有很多选项的命令。不一样。用换行符替换注释符号前的空格?您可以在shell脚本文件中用注释行替换续行,似乎不需要特别的技巧。更不用说\s有效地合并这些行并不正确,问题是反斜杠必须紧跟在换行符之前才能转义,而对于cmd\comment,在反斜杠和换行符之间有空格和注释。接受的答案应该是Marwan的下面。我想我不同意,Marwan的答案很聪明,但感觉像是滥用替代。如果我说菲利普的答案更接近我想做的事情,还有另一种方法,这不涉及通过黑客攻击$IFS的子shell:请参阅。事实上,这一个被标记为已接受的答案,而Marwan的答案被建议反对,理由与99%的性能无关/100%的用户认为来这里寻找解决方案是错误的,这既令人悲伤,也代表了软件开发的错误。这太多是有问题的,因为它依赖于不使用双引号
在扩展部分周围搜索,这样它就会随着分词而消失。这与教人们添加双引号的必要性背道而驰,这样在数据中出现空白字符时,分词就不会把它们弄乱。我认为理解为什么引号几乎总是很重要是很重要的,以及理解为什么缺少引用可能是故意的。也就是说,这是一个严重的黑客行为,我永远不会在我自己的shell脚本中使用它。是的,当然,为什么也应该被理解,但遗憾的是,并不是每一个看到一段旧代码的人都完全理解它。。。即使没有像这样富有创造性的解决方案,sh语言似乎也不是最容易理解的。尽管如此,我很高兴读到括号中的最后一句话。