How to put a line comment for a multi-line command
我知道如何在Bash脚本中编写多行命令,但是如何在多行命令中为每一行添加注释?
1 2 3
| 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 |
但不幸的是,继续字符\之后的注释将破坏命令。
-
将代码块复制到与其相邻的注释/注释块,如果更新代码,请记住更新注释块。
-
L @@ K在Marwan的回答中。 这完全是巧妙的。 这应该是公认的答案。
-
注意:此问题及其解决方案也适用于多行字符串。
-
仅供参考,这不是这个问题的重复,链接的问题是询问使用管道的命令... vs这个问题是讨论一个有很多选项的命令。 不一样的。
我就是这样做的。基本上通过使用Bash的反引号命令替换,可以将这些注释放在长命令行的任何位置,即使它是跨行分割的。我已将echo命令放在您的示例前面,以便您可以执行该示例并查看其工作原理:
1 2 3
| echo CommandName InputFiles `#1st comment` \
--option1 arg1 `#2nd comment` \
--option2 arg2 `#3rd comment` |
另一个例子,您可以在一行的不同点放置多个注释:
1
| some_cmd --opt1 `#1st comment` --opt2 `#2nd comment` --opt3 `#3rd comment` |
-
它甚至可以在管道子命令中运行:"echo`#1` foo newline)| perl -ne`#2`'print'"......正是我需要的!
-
这是我见过的最巧妙的替代滥用行为!
-
对我来说,当我想在脚本文件中阻止长多行命令中某些选项的操作时,快速解决问题很有用。
-
只是不要使用任何包含;或&等命令终止符的注释。
-
这个技巧bash是特定的还是它也适用于其他shell如dash和csh?
-
这种技术为每个内联注释创建一个子shell,因此这些是非常昂贵的注释。它们仅适用于不经常执行的行。
-
这些注释非常昂贵,因为它们中的每一个都创建了一个子shell。这使得该技术在某些情况下无法使用。使用相同基本思想的便宜得多的,如果不太可读的替代方案是:echo CommandName InputFiles ${IFS# 1st comment} --option1 arg1 ${IFS# 2nd comment} --option2 arg2 ${IFS# 3rd comment}。
-
请注意,在这些示例中#之后缺少空格没有什么特别之处。如果你想以这种方式格式化注释,那么添加空格就好了(如在OP中)
-
有趣的是它如何仅与反引号一起使用,而不是在使用$()使用命令替换时。有什么理由吗?
-
@pjh:值得指出的是,在你的解决方案中,引号需要被转义,但在好的方面,内联注释本身可以是多行的。
-
@pjh,不适用于所有shell。 dash在没有命令的情况下优化fork和pipe以进行命令替换,并且ksh93不会为子shell分叉(并且只在需要执行外部命令时才创建管道)
-
@WaelJ强调"巧妙滥用替代"中的"滥用"
-
即使每个都创建了一个子shell,但一旦处理了注释,这些子shell中的每一个都会退出。所以唯一的长期影响是每个评论将?/ .bash_history文件扩展一行。这种方法很棒。这几乎不是我所说的滥用。无论如何,在rsync备份中不需要.bash_history。结论: - >如果您的主驱动器对如此小的添加非常敏感,那么无论您是否使用此方法,您都已经在系统中构建了滥用行为。如果这是真的,它总是在失败的边缘摇摇欲坠。
-
正确vim突出显示的替代方法:: 'COMMENT'而不是# COMMENT。
-
@pjh有关${IFS#Comments}的潜在问题,请参阅此处。
-
抱歉,我不小心点击了"向下投票"按钮,我无法将其撤消,因为它已被锁定,我该如何撤消?
-
@ osexp2003我编辑了帖子,你现在可以撤消了
-
感谢你的帖子!
-
@phk"有趣的是它如何仅与反引号一起工作,但在使用$()使用命令替换时却没有。有什么理由吗?"一旦$()看到#,该行的其余部分将被视为注释,并且括号永远不会被关闭。反引号解析不同。你可以改为$(: comment)。 stackoverflow.com/questions/1455988/commenting-in-a-bash-script/
您可以将参数存储在数组中:
1 2 3 4 5 6 7 8 9
| 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[@]}" |
但是,我认为如果只是为了允许每个参数的注释,这看起来有点hackish。因此,我只是重写注释,以便引用各个参数,并将其置于整个命令之上。
-
这适用于像OP的示例那样简单的东西,但它不支持>和<以及|和||以及&&等等。
-
@Philipp嗯,谢谢。这是一个很好的解决方法。但是如果我的--option arg同时具有'和",我担心会有点混乱。
-
@Philipp,我真的不知道哪一个应该是正确答案。似乎没有正确的答案。所以我赞成你的答案,并将佩里标记为正确的答案。
-
@PeterLee:您也可以在数组中使用"和'。
-
不太讨厌只是将参数存储在数组中,然后像这样使用它们:CommandName"${args[@]}"。
-
如果您希望能够在参数列表中注释掉整行,则此格式优于所有其他格式。 command"${args[@]}" ftw。
我担心,一般来说,你不能做你所要求的。您可以做的最好是对命令前面的行进行注释,或者在命令行末尾添加一条注释,或者在命令后注释。
您无法以这种方式在命令中散布注释。 \表示合并行的意图,因此对于所有意图和目的,您试图在单行中散布注释,这无论如何都不起作用,因为\必须位于行的末尾有这种效果。
-
更不用说"\ s有效地合并这些行"甚至是不对的,问题是反斜杠必须紧接在换行符之前才能转义它,而使用cmd \ # comment则有空格并且之间有注释反斜杠和换行符。
-
接受的答案应该是Marwan的下面。
-
我认为我不同意,Marwan的答案很聪明,但感觉就像是滥用替代品。如果有什么我会说菲利普的答案更接近我想要做的事情。
-
还有另一种方法可以做到这一点,它不涉及通过黑客攻击的子弹$IFS:见这里。
-
事实上,这个被标记为接受的答案,而Marwan的回答被建议反对基于与99%(表现)/ 100%("感觉不对")的用户来到这里寻找解决方案无关的理由是悲伤和代表软件开发有什么问题。
-
Marwan的答案是严重滥用替代符号。它与性能无关,与它一切可爱但不是一个好主意有关。
-
@Perry这是一个很有价值的判断你已经到了那里。
根据pjh对此问题的另一个答案的评论,将IFS替换为已知不包含非空白字符的变量。
1 2 3
| comment=
who ${comment# This is the command} \
-u ${comment# This is the argument} |