我想编辑 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/g
、1,3d
、/pattern/,$d
、w
、q
等命令的wq
工作方式与 vim 一样。
i
、a
和等命令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 中,使用 的可能性得到支持,但手册中没有提到。对所有行的使用 显然是由 发明的,似乎是因为,那里,意味着而不是中的。%
ed
ed
%
info
%
ex
,
.,.
1,$
ed
EDIT2:设置不同的编辑器
与其他答案一样,如果要指定其他编辑器,可以通过设置EDITOR
或VISUAL
环境变量来实现。两者之间的区别在这个答案。
如果您想为单个命令设置它,您可以这样做:
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 crontab
,ps
是正在运行的ps
命令。剩下ed
(由同名包)。
如果您不知道如何退出编辑器,您可以在此时使用 或 将其kill 26302
终止kill %1
。
ed 是什么?
Ed 是一款古老的编辑器,可以追溯到显示器普及之前。它是为计算机设计的,其交互式输出外围设备是电传打字机。
最开始显示的0
是文件的行数。显然这是很重要的信息。
?
表示 ed 不明白您输入的内容。行式打印机速度很慢,因此 ed 不会浪费时间和墨水来显示无意义的信息(例如错误消息)。一个老笑话(我不知道出处)是这样的:
肯·汤普森有一辆他参与设计的汽车。与大多数汽车不同,这辆车没有速度表、油量表,也没有困扰现代司机的其他众多指示灯。相反,如果司机犯了错误,仪表盘中央会亮起一个巨大的“?”。汤普森说:“经验丰富的司机通常会知道哪里出了问题。”
如果您觉得自己缺乏经验,您可以发出命令H
(除一个命令外,所有命令都是一个字母(不计算数据参数),因为谁喜欢打字),然后您会收到错误消息。例如,如果您只按Enter…
?
H
Invalid address
很清楚,不是吗?(空行是空命令 — 不是单个字母的命令。空命令移动到下一行并打印。如果您在文件末尾(空文件中总是如此),则没有下一行,因此您请求移动到的地址无效。)
如何获得另一个编辑器
该crontab
命令与大多数运行文本编辑器的命令一样,检查环境变量VISUAL
并EDITOR
(按该顺序)决定运行哪个程序,然后返回系统默认值。如果其中一个变量设置为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
作为您的编辑器。
笔记:
- 如果你愿意,你可以选择不同的编辑器作为你的默认编辑器
- 如果您想永久设置默认编辑器
vim
,您必须将上述命令添加到您的~/.bashrc
或~/.profile
类似文件中。
答案4
要使用 VI 编辑器编辑 crontab,请使用以下命令。
EDITOR="vi" crontab -e
或者,如果您想使用其他编辑器(如 gedit、nano 等)进行编辑,只需将 vi 替换为编辑器名称。