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

tij*_*agi 7 bash shell sh

我想像这样嵌入评论

ls -l \
-a \
# comment here
-h \
-t . 
Run Code Online (Sandbox Code Playgroud)

但这似乎是不可能的。也许存在其他变体?将评论放在反斜杠之后或以反斜杠结束评论无济于事。

Dit*_*iti 6

据我所知,这是不可能的,因为 Bash 试图遵循 POSIX 指南和其他标准。尤其:

如果 a<newline>跟在反斜杠后面,shell 会将其解释为行继续。<newline>在将输入拆分为标记之前,应删除反斜杠和s。由于转义<newline>字符完全从输入中删除并且没有被任何空格替换,因此它不能用作标记分隔符。
Shell 命令语言2.2.1 转义字符(反斜杠)

因此,由于 shell 解析器的工作方式,这是不可能的:

  • 以 开头的行#是注释,之后没有任何评估(包括尾随\
  • \不是在一行结束时,是行跳过。

在你的脚本中:

ls -l \
-a \
# comment here
-h \
-t .
Run Code Online (Sandbox Code Playgroud)

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


Cha*_*ffy 5

您可以使用不需要连续字符的数组执行类似操作:

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
Run Code Online (Sandbox Code Playgroud)

...但对于一般情况,答案是否定的。


LC-*_*ist 5

上面的帖子没有直接的解决方案。但是,在更旧的帖子中实际上提到了一个直接的解决方案:How to put a line comment for a multi-line command and Commenting in a Bash script

我最喜欢的解决方案是:

ls -l `# long format` \
-a `# all files` \
-h `# human readable` \
-t `# time sort`
Run Code Online (Sandbox Code Playgroud)

您将需要重音符号 (`) 引号和八字 (#) 来指示注释。在反斜杠前使用它们。

  • 问题是这会为每个评论创建并执行一个子shell (7认同)