输入 bash 命令,我已经到了第三行。但是我如何返回到开头来编辑我错过的内容呢?

Mar*_*arc 22 bash

我正在输入该命令,我的光标位于“supprimer des warnings”的末尾

\n
$ git commit -m "Nettoyage :\n>     - Suppression de sources ou projets inutiles\n>     - Corrections mineures sur les sources pour supprimer des warnings"\n
Run Code Online (Sandbox Code Playgroud)\n

这时我注意到我应该在提交消息的开头写上“Nettoyage (deuxi\xc3\xa8me party)” 。

\n

...但是,在我的命令的最后一行,我如何可以转到它的开头,在它的第一行编辑它?

\n

Ste*_*itt 54

不幸的是,Bash 中的命令输入是面向行的,您在输入多行命令时不能返回到上一行。

\n

但是,您可以做的是使用到目前为止输入的完整命令启动编辑器。为此,请在 Emacs 模式(默认)下按CtrlxCtrle; 在 vi 模式下,按Escv。这将打开您的编辑器,其中包含您迄今为止输入的所有内容;修复需要修复的内容,完成命令,退出编辑器,Bash 将运行编辑后的命令。

\n

在这种特殊情况下,您可以对整个git提交消息使用编辑器:省略该-m选项,git将为您启动一个编辑器。

\n

  • 我已经使用 bash 几十年了,但我从来不知道它可以做到这一点! (12认同)
  • 当我测试这个时,它让我修复编辑器中的命令,然后运行修复的命令,但它也让我仍然编辑原始的部分命令(任何输出显示在中间),所以我必须取消它使用 Ctrl-c。这正常吗? (4认同)
  • @dargaud vi 和 emacs 模式仅影响键盘快捷键。Bash 使用您的 EDITOR 变量来打开您选择的文本编辑器 (2认同)

Jim*_* L. 14

CtrlC,然后按Up,然后重新编辑命令,然后按Enter

# git commit -m "Nettoyage :
>      - Suppression de sources ou projets inutiles
>      - Corrections mineures sur les sources pour supprimer des warnings
>      - Autre chose^C
Run Code Online (Sandbox Code Playgroud)

通过按CtrlC该行的末尾,我会丢失该行,但只需按一下Up键,我就会返回:

# git commit -m "Nettoyage :
     - Suppression de sources ou projets inutiles
     - Corrections mineures sur les sources pour supprimer des warnings
Run Code Online (Sandbox Code Playgroud)

我的光标放在“ings”后面。然后,我可以使用 and 来回浏览所有三行文本,使用LeftorRight导航到命令的开头,使用or导航到命令的结尾,等等。HomeCtrlAEndCtrlE

据我所知,我没有使用任何奇特的阅读线设置。似乎是 FreeBSD 13.0 上 Bash 5.1.16 的标准行为。

  • @terdon MacOS,bash 4.2.46,^c 后跟向上箭头/^p 会导致绘制所有线条,我可以将光标移过它们。 (4认同)
  • 这不适用于多行命令。至少在我的系统上没有。按 Ctrl+C 然后按向上键只能编辑第一行,而无法编辑其余行。您的系统的行为是否有所不同? (2认同)
  • 诡异的。也许是“readline”设置或其他什么,@BowlOfRed?在我使用 bash 5.1.16 的 Arch Linux 上,按 Ctrl+C 然后向上只会返回命令的部分内容,直到输入最后一个换行符。 (2认同)

ter*_*don 7

你不知道。或者据我所知,我希望其他人能发表答案并证明我错了!到目前为止,我发现的最好的事情是点击Enter移动到新行(如果没有这个,在我的系统上,您不会在后面的步骤中返回完整的命令,而只能返回最后一个换行符输入之前的部分)并且然后Ctrl+D中止命令:

\n
$ git commit -m "Nettoyage :\n>      - Suppression de sources ou projets inutiles\n>      - Corrections mineures sur les sources pour supprimer des warnings\n
Run Code Online (Sandbox Code Playgroud)\n

现在按Enter

\n
$ git commit -m "Nettoyage :\n>      - Suppression de sources ou projets inutiles\n>      - Corrections mineures sur les sources pour supprimer des warnings\n>\n
Run Code Online (Sandbox Code Playgroud)\n

现在Ctrl+ D

\n
$ git commit -m "Nettoyage :\n>      - Suppression de sources ou projets inutiles\n>      - Corrections mineures sur les sources pour supprimer des warnings\n> bash: unexpected EOF while looking for matching `"'\n
Run Code Online (Sandbox Code Playgroud)\n

您现在可以按\xe2\x87\xa7(向上)返回到上一个命令,现在您将能够按预期编辑它:

\n
$ git commit -m "Nettoyage :\n     - Suppression de sources ou projets inutiles\n     - Corrections mineures sur les sources pour supprimer des warnings\n
Run Code Online (Sandbox Code Playgroud)\n

并不完美,但它可能可以作为一种解决方法。

\n

  • 恕我直言,@terdon,在我看来,按 Ctrl-C 中止比按 Enter 更好。Enter 可能会导致执行语法正确但上下文不正确的命令。 (4认同)

JoL*_*JoL 7

对于您的问题:如何编写让您返回第一行的多行 shell 命令

Enter不要在第一行末尾点击,而是使用Ctrl+ V Ctrl+ J。这将插入一个换行符,而无需输入 bash 命令。>不会打印新的提示(如),因为对于 bash,它仍然是相同的条目。如果您这样做了,那么在使用默认的 emacs 键绑定或使用 vi 键绑定时,您将能够使用Ctrl+返回到第一行。A^

以下是使用默认 emacs 绑定的 bash 示例:

带有 bash emacs 绑定的多行提示输入示例

如果您使用 zsh 而不是 bash,则可以使用向上/向下键,或使用默认 emacs 键绑定的Ctrl+ P/ Ctrl+ ,或使用 vi 键绑定的/在单个提示条目的行之间移动。Njk

如果您将 zsh 与 vi 键绑定一起使用,则还可以在正常模式下使用o/O在同一提示条目中的当前行下方或上方创建新行。这些是我通常在 zsh 中使用的键绑定:

使用 zsh vi 绑定的多行提示输入示例

针对您的情况:如何从命令末尾修复 git 消息的开头

-e只需在命令末尾添加,git 就会将您带到带有-m参数内容的编辑器。

以下是您在特定情况下可以采取的措施的示例:

git 编辑示例