当行用反斜杠分割时,是不是可以使用注释?
Posted
技术标签:
【中文标题】当行用反斜杠分割时,是不是可以使用注释?【英文标题】:Is it possible to use comments when the line is split with backslashes?当行用反斜杠分割时,是否可以使用注释? 【发布时间】:2014-06-28 18:25:00 【问题描述】:我想嵌入这样的 cmets
ls -l \
-a \
# comment here
-h \
-t .
但这似乎是不可能的。也许确实存在其他一些变体?在反斜杠之后放置评论或以反斜杠结束评论都没有帮助。
【问题讨论】:
【参考方案1】:上面的帖子没有直接的解决方案。但是,在更早的帖子中实际上提到了一个直接的解决方案:How to put a line comment for a multi-line command 和 Commenting in a Bash script。
我最喜欢的解决方案是:
ls -l `# long format` \
-a `# all files` \
-h `# human readable` \
-t `# time sort`
您将需要重音符号 (`) 引号和八角符号 (#) 来指示注释。在反斜杠之前使用它们。
【讨论】:
问题是这会为每个评论创建并执行一个子shell【参考方案2】:你可以用一个不需要连续字符的数组做这样的事情:
ls_cmd=(
ls
-l # long form
-a # show hidden files
-h # human-readable sizes
-t # sort by time
.
)
"$ls_cmd[@]" # run the command from the array
...但对于一般情况,答案是否定的。
【讨论】:
【参考方案3】:...可以在管道之后完成:
echo "Hello beautiful" | \
# Display match only:
grep -o beautiful
但是,否则……不。
【讨论】:
【参考方案4】:在那种情况下,我通常会选择类似的东西
ls -l -a -h -t .
# | | | time sort
# | | human readable
# | all files
# long format
或者当它们存在时我使用参数的长形式,例如--human-readable
而不是 -h
。
【讨论】:
现在想象一下,你的实际命令行由多个参数长名称组成,每个参数都有一个字符串,所以整个命令需要几行。 @tijagi 在这种情况下,我会按组将参数分配给具有有意义名称的变量,例如在 Makefile 中经常这样做。然后,您可以将变量赋值与 cmets 交错。【参考方案5】:不直接,买你可以把这样的cmets放在一个数组赋值中。 (这也允许您在不使用续行的情况下将参数拆分为多行。)
cmd_options=(
-l
-a
# comment here
-h
-t .
)
ls "$cmd_options[@]"
【讨论】:
【参考方案6】:据我所知,这是不可能的,因为 Bash 试图遵循 POSIX 准则和其他标准。 特别是:
如果
<newline>
跟在反斜杠后面,shell 应将此解释为行继续。在将输入拆分为标记之前,应删除反斜杠和<newline>
s。由于转义的<newline>
完全从输入中删除,并且没有被任何空格替换,因此它不能用作标记分隔符。 — Shell 命令语言,2.2.1 Escape Character (Backslash)
因此,由于 shell 解析器的工作方式,这是不可能的:
以#
开头的行是注释,之后不会被评估(包括结尾的\
)
\
不在行尾,不是跳行。
在您的脚本中:
ls -l \
-a \
# comment here
-h \
-t .
注释行被替换为空(即它没有标记);并且由于该命令到目前为止是有效的,并且遇到换行符(… -a ↵
),shell 运行ls -l -a
命令,然后运行-h -t .
命令(并且在您的$PATH
,所以它就停在那里。)
【讨论】:
在你的最后一段中,遇到的换行符是在评论的末尾,而不是在“-a \”之后。 @spkersten 是的,我还不够清楚(我使用空格字符来表示换行符,但我应该使用 ↵ 代替。)谢谢!【参考方案7】:这是不可能的。因为反斜杠是一个续行符,而注释是一个单个字符,这使得它右边的所有内容都被忽略,直到行尾:
ls \
# -l \
-h
-l
将被忽略,ls
命令被执行,-h
被视为新命令。
因为在类 C 语言中,您有带有边界的 cmets:/* */
可以将它们放在使用行继续的表达式中的标记之间。
【讨论】:
【参考方案8】:我认为你不能直接这样做,因为注释删除是在反斜杠连接之前完成的,所以这不起作用
# commenting \
seveal lines
显而易见的解决方案是在每一行都使用#
:
# commenting
# seveal lines
如果你想有创意,你可以使用一个肮脏的把戏:
: 'This is almost
a multiline comment'
实际上不是注释,但除了将退出代码更改为 0 之外,它什么也不做。
【讨论】:
以上是关于当行用反斜杠分割时,是不是可以使用注释?的主要内容,如果未能解决你的问题,请参考以下文章