当用反斜杠分割线时是否可以使用注释?

时间:2014-05-11 10:05:49

标签: bash shell sh

我想嵌入像这样的评论

ls -l \
-a \
# comment here
-h \
-t . 

但似乎不可能。也许还存在其他一些变体?在反斜杠之后立即发表评论或以反斜杠结束评论无济于事。

8 个答案:

答案 0 :(得分:3)

据我所知,这是不可能的,因为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 .命令(并且找不到-h中的$PATH二进制文件,因此它就会停在那里。)

答案 1 :(得分:2)

在那种情况下,我通常会选择

ls -l  -a  -h  -t .  
#  |   |   |   time sort
#  |   |   human readable
#  |   all files
#  long format

或者当它存在时我使用长形式的参数,例如--human-readable而不是-h

答案 2 :(得分: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 :(得分:1)

不直接,买可以将这些注释放入数组赋值中。 (这也允许您在不使用行继续的情况下将参数拆分为多行。)

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

答案 4 :(得分:0)

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

# commenting \
seveal lines

显而易见的解决方案是在每一行使用#

# commenting
# seveal lines

如果你想要有创意,可以使用肮脏的技巧:

: 'This is almost
a multiline comment'

实际上不是评论,但除了将退出代码更改为0之外,它什么也没做。

答案 5 :(得分:0)

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

ls \
# -l \
-h

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

因为在类C语言中你有边界注释:/* */可以将它们放在使用行继续的表达式中的标记之间。

答案 6 :(得分:0)

......它可以在管道之后完成:

echo "Hello beautiful" | \
# Display match only:
grep -o beautiful

但是,否则......不。

答案 7 :(得分:0)

以上帖子没有直接的解决方案。但是,甚至在更早的帖子中也提到了直接解决方案:How to put a line comment for a multi-line commandCommenting in a Bash script

我最喜欢的解决方案是:

//in your html|js
function OnAppReady(){
    console.log("### application is loaded")
}

您将需要带有重音符号(`)和八字形字体(#)的注释。在反斜杠前使用它们。