那是ed

那是ed

我想编辑 crontab。它应该是 Vi,但事实并非如此,正如您所见:

root@euve252628:~# crontab -e

0

0 * * * * /var/www/vhosts/nevemind-what-webs/httpdocs/megacronstunde.php

?

:wq

?

是的,它给了我一个?。为什么它给了我零分?

当我输入 aq并按下Enter- 时,它退出。我需要知道如何保存,因为它不是经典的 Vi。

答案1

那是ed

默认情况下,它的提示是空字符串。如果要退出,只需输入q。不要在前面加上:。如果有未保存的更改,它将回复?。您可以将其解释为“您确定吗?”,然后再次输入命令进行确认q。顺便说一句,它不理解的任何命令也会导致它回复?。这是它知道的唯一错误消息。

它的命令是基于 vim/vi/ex/sed 的,所以g/re/p%s/vi/&m/g1,3d/pattern/,$dwq等命令的wq工作方式与 vim 一样。

ia和等命令c进入插入模式。要退出插入模式并返回命令模式,只需输入只有 的行.。要“移动”到另一行,只需输入行号、与当前行的偏移量(如+2-1)或正则表达式作为命令以转到该行。.表示命令模式下的当前行。您可以使用它来了解您所在的位置。$表示最后一行。

顺便说一句,如果您想了解更多信息,这是 Linux 中的 GNU 程序,它的大部分文档都在info ed而不是man ed

这是一个示例会话,其中添加了注释(未被 ed 接受):

$ ed
i                    # insert (on current line)
vi
.                    # end insert
%s/vi/&m/g           # substitute vi for vim globally in all lines
i                    # insert (on current line)
first line
.                    # end insert
$a                   # append on last line
last line
.                    # end insert
%p                   # print all lines
first line
vim
last line
2                    # move to line 2 and print it
vim
/line                # move forward to line matching /line/ and print it
last line
-1                   # move 1 line backwards and print it
vim
?line                # move backward to line matching /line/ and print it
first line
+1                   # move 1 line forward and print it
vim
g/line/p             # print lines matching /line/ (grep)
first line
last line
p                    # print (current line)
last line
.                    # move to current line and print it
last line
c                    # change (current line)
final line
.                    # end insert
%p                   # print all lines
first line
vim
final line
/vim/,$c             # change from line matching /vim/ to last line
that's all
.                    # end insert
%p                   # print all lines
first line
that's all
wq                   # write and quit
?                    # write what?
h                    # help with last error message
No current filename
wq                   # write and quit to check error message
?
H                    # help with all error messages
No current filename
wq                   # write and quit to check error message
?
No current filename
wq file.txt          # write file.txt and quit
22                   # wrote 22 bytes

编辑:就像grawity提到的那样,可以使用h或激活更多有用的错误消息H。此外,命令的范围部分,而不是是 中引用“所有行”的官方方式。在GNU 中,使用 的可能性得到支持,但手册中没有提到。对所有行的使用 显然是由 发明的,似乎是因为,那里,意味着而不是中的。%eded%info%ex,.,.1,$ed

EDIT2:设置不同的编辑器

与其他答案一样,如果要指定其他编辑器,可以通过设置EDITORVISUAL环境变量来实现。两者之间的区别在这个答案

如果您想为单个命令设置它,您可以这样做:

EDITOR=vi crontab -e

或者如果您希望在 shell 会话中启动的所有程序都使用它,请这样做:

export EDITOR=vi
crontab -e

您可以将 保存export~/.profile或中/etc/profile,具体取决于您希望将其作为 bash 的用户设置还是系统设置。这是设置编辑器的 unix 可移植方式;您可以在任何发行版中执行此操作。

在 Ubuntu 中,还有update-alternatives命令。可以使用 查看当前的默认编辑器update-alternatives --display editor,也可以使用update-alternatives --config editor进行设置:

$ sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode.

答案2

如何找出这个编辑器是什么

Ctrl+ Z。这将暂停编辑器并显示 shell 提示符。在提示符下,运行ps以查看此终端中正在运行的进程。

bash-4.3$ crontab -e
1077
^Z
[1]+  Stopped                 crontab -e
bash-4.3$ ps
  PID TTY          TIME CMD
26295 pts/10   00:00:00 bash
26297 pts/10   00:00:00 crontab
26298 pts/10   00:00:00 sh
26299 pts/10   00:00:00 ed
26302 pts/10   00:00:00 ps

bash是原始 shell,crontab是预期 shell,sh是必须由 调用的另一个 shell crontabps是正在运行的ps命令。剩下ed(由同名包)。

如果您不知道如何退出编辑器,您可以在此时使用 或 将其kill 26302终止kill %1

ed 是什么?

Ed 是一款古老的编辑器,可以追溯到显示器普及之前。它是为计算机设计的,其交互式输出外围设备是电传打字机

最开始显示的0是文件的行数。显然这是很重要的信息。

?表示 ed 不明白您输入的内容。行式打印机速度很慢,因此 ed 不会浪费时间和墨水来显示无意义的信息(例如错误消息)。一个老笑话(我不知道出处)是这样的:

肯·汤普森有一辆他参与设计的汽车。与大多数汽车不同,这辆车没有速度表、油量表,也没有困扰现代司机的其他众多指示灯。相反,如果司机犯了错误,仪表盘中央会亮起一个巨大的“?”。汤普森说:“经验丰富的司机通常会知道哪里出了问题。”

如果您觉得自己缺乏经验,您可以发出命令H(除一个命令外,所有命令都是一个字母(不计算数据参数),因为谁喜欢打字),然后您会收到错误消息。例如,如果您只按Enter

?
H
Invalid address

很清楚,不是吗?(​​空行是空命令 — 不是单个字母的命令。空命令移动到下一行并打印。如果您在文件末尾(空文件中总是如此),则没有下一行,因此您请求移动到的地址无效。)

如何获得另一个编辑器

crontab命令与大多数运行文本编辑器的命令一样,检查环境变量VISUALEDITOR(按该顺序)决定运行哪个程序,然后返回系统默认值。如果其中一个变量设置为ed,请更改或删除它。

在 Ubuntu(以及 Debian 和其他版本)上,系统默认编辑器是/etc/alternatives/editor,通过替代机制默认情况下,它会选择已安装的“最佳”编辑器,其中“最佳”由软件包维护者设置的优先级定义。使用update-alternatives配置替代方案。您可以使用以下方式显示可用的编辑器及其优先级:

update-alternatives --display editor

ed优先级为 -100,而所有其他“合理”编辑器的优先级均为正,因此只有在未安装编辑器的情况下才会默认使用它。Ubuntu 的默认安装使用 nano 作为默认编辑器,优先级为 400。如果已将替代方案设置为ed,则可以使用以下方法进行更改

sudo update-alternatives --config editor

答案3

从您的问题来看,您的默认编辑器似乎不是vim,并且当前默认编辑器存在问题。

以下命令将设置默认编辑器为vim

export EDITOR=vim

将默认编辑器设置为后vim,运行crontab -e将使用vim作为您的编辑器。

笔记:

  1. 如果你愿意,你可以选择不同的编辑器作为你的默认编辑器
  2. 如果您想永久设置默认编辑器vim,您必须将上述命令添加到您的~/.bashrc~/.profile类似文件中。

答案4

要使用 VI 编辑器编辑 crontab,请使用以下命令。

EDITOR="vi" crontab -e

或者,如果您想使用其他编辑器(如 gedit、nano 等)进行编辑,只需将 vi 替换为编辑器名称。

相关内容