我想像这样嵌入评论
ls -l \
-a \
# comment here
-h \
-t .
Run Code Online (Sandbox Code Playgroud)
但这似乎是不可能的。也许存在其他变体?将评论放在反斜杠之后或以反斜杠结束评论无济于事。
据我所知,这是不可能的,因为 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,因此它就停在那里。)
您可以使用不需要连续字符的数组执行类似操作:
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)
...但对于一般情况,答案是否定的。
上面的帖子没有直接的解决方案。但是,在更旧的帖子中实际上提到了一个直接的解决方案: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)
您将需要重音符号 (`) 引号和八字 (#) 来指示注释。在反斜杠前使用它们。