当行用反斜杠分割时,是不是可以使用注释?

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 之外,它什么也不做。

【讨论】:

以上是关于当行用反斜杠分割时,是不是可以使用注释?的主要内容,如果未能解决你的问题,请参考以下文章

VS下的C++代码引用文件时文件路径要用正斜杠“/”,而不能用反斜杠““

JSON 用反斜杠打印

为啥用反斜杠开始一个 shell 命令?

斜杠/,反斜杠,斜杠/,点斜杠./,点点斜杠../

Python3基础 print 用反斜杠输出单引号与双引号

python中的正斜杠反斜杠