当我阅读需要安装许多软件包的教程时,他们通常会\
在行尾出现反斜杠?
sudo apt install gcc git pkg-config meson ninja-build \
libavcodec-dev libavformat-dev libavutil-dev \
libsdl2-dev
为什么?当我将命令复制粘贴到我的 Linux 终端时,它永远不会起作用,我必须删除反斜杠并将所有内容放在一行上。这是怎么回事?
bash 使用反斜杠来指示行继续,并且通常用于 bash 脚本中。但是,反斜杠实际上是 bash 转义字符。因此,这种使用反斜杠“转义” \newline 以创建延续。很酷,很高兴知道,嗯?特别是,GNU bash 手册的第 3.1.2.1 节说:
要回答您的具体问题:作者只是表明多行表达式是单行 bash 命令。如果 '\' 后面没有字符但 \newline 后没有字符,则此多行表达式将起作用。但是,如果进行剪切和粘贴,则“\”之后可能会出现各种杂乱无章的内容(例如空格)。因此,要么删除 '\' 之后的所有尾随字符,要么将命令放在一行,就像你一直在做的那样。我经常发现在输入长命令时使用 '\' 很方便,但这是个人喜好问题。
行尾的
\
字符被解释为 bash 中的行继续字符,它告诉 bash 期望在下一行继续执行命令,除非:\
字符是由单引号或双引号字符括起来的字符串的一部分\
通过在它前面放置另一个反斜杠字符来转义该字符,\\
这使得它被解释为文字字符。注意:不带引号的反斜杠
\
也用作 bash 中的转义字符。将多行命令(如下例)从文本编辑器复制/粘贴到终端会导致命令作为单行命令执行。
原文:
原始文本复制/粘贴到终端:
当下一个多行命令从文本编辑器复制/粘贴到终端时,会导致打印反斜杠字符。反斜杠在此命令中被解释为文字反斜杠字符,因为它们包含在一对(单个)引号字符中。
原文:
在终端:
此答案中的所有命令最初都是我在文本编辑器中输入的,然后将它们粘贴到终端中,因此命令中没有不可见的字符可能导致命令不起作用。
\
sh
是/中的行继续字符,bash
就像在 C(用于#defining 长宏)或其他几种计算机语言中一样,允许在源代码中包装长行而不改变面向行的语言中的含义。如果选择在字符后不包含任何空格
\
,仅包含换行符,则它仅适用于单个粘贴。(在 Chromium 中,它显示为一个蓝色字符“框”,在行尾看起来像一个空格,但显然这实际上是换行符。)一些网页在其格式化代码中包含尾随空格。也许作者从一个终端复制/粘贴了一个固定宽度的空格,并且没有为他们的代码块清理它。您可以通过选择整个内容并查看行尾来直观地说明这一点。 如果它很好,您可以粘贴到终端中。如果没有,您可以粘贴到编辑器中并
\ ... spaces newline
自己折叠。或者,如果它不是太复杂,您可以在命令行上粘贴单引号,然后使用向上箭头来修复它。
或者单独粘贴每一行,如果这对你来说更容易,省去
\...
创建一条长线。或者甚至手动在副本中包含\
但不包含尾随空格或换行符,然后在粘贴每一行后按回车键。Chromium 至少允许您使用 shift+左/右箭头调整您的选择,如果您无法使用鼠标获取所有您想要的字符,而不是您不想要的字符。
Stack Exchange 代码格式化块可以忠实地重现好的和坏的示例,因此您可以在浏览器中尝试一下以查看要查找的内容。
粘贴结果:
\
唯一转义一个空格,而不是换行符。每条线本身都是无害的,因此可以安全地玩耍。不像rm *
应该是其他东西的一部分,或者启动任何真正的程序,除非你有别名或称为2
或 3` 的 shell 函数。一种无需启动单独编辑器即可快速修复的方法:
粘贴在单引号内:
请注意,bash 使用
$'C-escaped'
语法将命令引用回给我。实际上,我确实按了 return 以将整个内容放入命令行历史记录中。Bash 行编辑不会回到之前已经提交的行,但是多行引用的东西确实会创建一个多行历史条目。从那里向上箭头将所有这些作为一个带有嵌入式换行符的命令提供给我,您可以编辑。您需要删除它们,否则它仍将被解释为多个命令,就像它们是
;
分号一样。当然也删除'
引号。Ctrl-w (unix-word-rubout) 将
\
其视为“单词”,并在其后停止。(与 Md (escape-d) 删除正向单词或 M-backspace (删除反向单词)不同;这些将删除反斜杠后面的单词)。Ctrl-w 甚至将换行符视为一个“单词”(这实际上不是我们想要的;从我们想要直接删除的第一个非空白字符到\
上一行)。ctrl-left (或 escape-f) / ctrl-right (或 escape-b) 将光标移动整个单词,以便您可以快速到达 control-w 的“行”的开头。或者 ctrl-r 反向 i-search
\
可以让你到达那里,然后 ctrl-right + left 到下一行的第一个单词。Ctrl-/ 是撤消,这真的很方便,因为它可以让你积极地重复按键或其他任何东西,并快速从过冲中恢复。
如果您经常使用 bash / readline 行编辑,您将已经记住其中的许多命令。我在这里提到它们只是为了让那些对 bash 行编辑经验较少的人受益,他们可能认为值得将其复制/粘贴到编辑器中,然后再复制到 bash 中。这当然是一种选择,特别是如果您已经打开了一个编辑器。
另一个可能有用的编辑命令是 M-\(元/转义反斜杠)。这将删除光标周围的空白。您可以只使用两次,将光标
\
放在 the 之后,将其保留为带有\
延续的多行内容。例如,使用向上箭头调用命令\
,然后向右箭头(或 ctrl-f)将光标移动到后面的空格\
\
. (或者 alt-\
如果您的终端已正确设置为用作 emacs 行编辑元,通常通过发送转义前缀。)(我不建议记住这些步骤,这只是使用行编辑完成工作的一种方式。)
或者您可以删除
\
和换行符(如果您愿意,可以将空格折叠到 1 个空格),就像我使用 control-w 建议的那样。当您将光标放在正确的位置时,Delete / ctrl-d 或退格键将删除换行符或反斜杠。Bash 行编辑显然没有 emacsM-space
将空格折叠为 1(而不是 0)空格,但您可以使用 M-\
+ 空格手动执行此操作。当您从格式如下的网页复制文本时:
并且它不起作用,那么您必须一次复制一行并将其粘贴到您的终端中,一次一行。将每一行复制到反斜杠 (
\
) 的末尾,并且后面没有空格。或者,您可以将所有三行复制到
gedit
另一个编辑器中,删除 \ 并制作一个像这样的“单行”:然后您可以从编辑器中复制单行并将其粘贴到终端中。