当使用反斜杠将行分隔时,是否可以使用注释?

15
我想嵌入这样的评论。
ls -l \
-a \
# comment here
-h \
-t . 

但似乎这是不可能的。也许存在其他变体?在反斜杠后面添加注释或以反斜杠结束注释并不能帮助解决问题。
8个回答

13
以上帖子没有直接的解决方案。但是,实际上在更早的帖子中提到了一个直接的解决方案:如何为多行命令添加一行注释Bash脚本中的注释
我最喜欢的解决方案是:
ls -l `# long format` \
-a `# all files` \
-h `# human readable` \
-t `# time sort`

你需要同时使用重音符号 (`) 和井号 (#) 表示注释。在反斜杠之前使用它们。

7
问题在于这会为每个注释创建并执行一个子shell。 - CervEd

11
据我所知,这是不可能的,因为Bash试图遵循POSIX准则和其他标准。特别地:

如果反斜杠后面跟着一个<newline>,则shell将把它解释为行续行符。在将输入分成标记之前,将删除反斜杠和<newline>。由于转义的<newline>完全从输入中删除,并且不被任何空格替换,因此它不能用作标记分隔符。
——Shell Command Language2.2.1 Escape Character (Backslash)

因此,由于shell解析器的工作方式,这是不可能的:
  • #开头的行是注释,不会评估后面的任何内容(包括尾随的\
  • 不在行末的\不是行跳过。
在你的脚本中:
ls -l \
-a \
# comment here
-h \
-t .

注释行被替换为空(即它没有令牌);由于目前命令是有效的,并且遇到换行符(… -a ↵),shell运行ls -l -a命令,然后运行-h -t .命令(并且在您的$PATH中找不到-h二进制文件,因此停在那里。)


在你的最后一段中,遇到的换行符在注释的末尾而不是在“-a \”之后。 - spkersten
@spkersten 这是真的,我没有表达清楚(我使用了空格字符来表示换行,但我应该使用↵代替。)谢谢! - Diti

8
您可以使用数组来实现此操作,这不需要使用续行符:
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

对于一般情况而言,答案是否定的。


2
在这种情况下,我通常会选择类似以下的东西。
ls -l  -a  -h  -t .  
#  |   |   |   time sort
#  |   |   human readable
#  |   all files
#  long format

当存在长格式参数时,我会使用长格式参数,例如--human-readable而不是-h


2
现在想象一下,您的实际命令行由多个参数组成,每个参数都有一个长名称,每个名称都需要一个字符串,因此整个命令需要几行。 - tijagi
1
在这种情况下,我会将参数按组分配给具有有意义名称的变量,就像在Makefile中经常做的那样。然后,您可以将变量分配与注释交错使用。 - damienfrancois

2
"...并且可以在管道符之后完成:"
echo "Hello beautiful" | \
# Display match only:
grep -o beautiful

但是,除此之外...不行。

2

虽然不能直接实现,但你可以将这样的注释放在数组赋值语句中。(这还可以让你在不使用行继续符的情况下将参数分散到多行中。)

cmd_options=(
  -l
  -a
   # comment here
  -h
  -t .
)
ls "${cmd_options[@]}" 

0

我认为你不能直接这样做,因为在反斜杠行拼接之前已经完成了注释的删除,所以这样是不起作用的。

# commenting \
seveal lines

明显的解决方案是在每一行使用 #
# commenting
# seveal lines

如果你想要创意,你可以使用一个卑鄙的技巧:

: 'This is almost
a multiline comment'

实际上不是注释,只是什么也没做,除了将退出代码更改为0。


0

这是不可能的。因为反斜杠是一种行继续符,而注释只是一个单独的字符,这使得右侧的所有内容都被忽略直到行末:

ls \
# -l \
-h

-l 将被忽略,执行 ls 命令并将 -h 视为新命令。

因为在类 C 语言中,你可以使用边界注释:/* */,所以可以在使用行续行的表达式中,在标记之间放置这些注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接