通常,我在单独的行中键入长命令,如下所示:
myapp -a foooooooo1 \
-b foooo2 \
-c foooooooooooooooo3 \
-d foooooooo4 \
bar
但我想将其更改为以下内容:
myapp -a foooooooo1
\ -b foooo2
\ -c foooooooooooooooo3
\ -d foooooooo4
bar
我想这样做是因为当我更改第一段代码时,我需要手动调整反斜杠,以便它们在彼此下方正确排列。对于第二段代码,如果我更改其中一个参数,反斜杠将不会移动。
答案1
shell 命令中不带引号的反斜杠的作用是转义下一个字符。另一种说法是,如果下一个字符具有特殊含义,则反斜杠会删除该字符的特殊含义。
换行符是命令终止符,就像;
其他一些字符一样。反斜杠从换行符中删除该函数,以便该命令可以在下一行继续。顺便说一句,这就是为什么在需要继续的行末尾的反斜杠后面甚至不能有空格字符,因为反斜杠不会转义实际的换行符。
shell 无法正确解析您建议的代码。相反,它会尝试将每一行作为单独的命令运行。
如果您的 shell 支持数组(例如bash
has),在某些情况下可能有用的另一种方法是将命令存储在数组中,如下所示:
mycommand=(
myapp -a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
此数组赋值中的换行符仅用作数组元素之间的分隔符,就像空格一样。需要嵌入空格的元素需要被引用,如示例所示(就像在任何情况下都需要在命令行上引用它们一样)。
要运行该命令,您可以使用
"${mycommand[@]}"
注意双引号是基本的。它们确保数组的每个元素都被单独引用。
或者,仅对参数使用数组:
myapp_args=(
-a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
进而:
myapp "${myapp_args[@]}"