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