crontab打开的此编辑器是什么?


41

我要编辑crontab。如您所见,它应该是Vi,但不是。

root@euve252628:~# crontab -e

0

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

?

:wq

?

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

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


5
最可能的是ed:默认情况下,它会给出一个字符计数(在基于Debian的系统中,这通常888是第一次,这是模板“空” crontab中的字符数)。如果看到计数为0,则必须对其进行修改。请参阅Crontab -e命令无法正常工作
-steeldriver,

31
ed,伙计!!man ed:gnu.org/fun/jokes/ed-msg.html
juhist 2017年

6
@juhist而不是评论,这应该是的答案。
甜点

1
虽然您通常只想覆盖EDITOR其他内容,但是如果您对实际使用ed感兴趣,那么这是一个很棒的介绍:sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov

顺便说一下,@ justme欢迎使用StackExchange!如果找到最能回答您问题的答案,则可以通过单击其旁边的对号来接受它。
JoL

Answers:


65

那是 ed

默认情况下,其提示为空字符串。如果要退出,请输入q。不要以开头:。如果您尚未保存更改,它将以答复?。您可以将其解释为“确定吗?”,然后q再次命令进行确认。顺便说一下,它不理解的任何命令也会引起它的应答?。那是它知道的唯一错误消息。

它的命令是什么VIM / VI / EX是基于/ SED上,所以命令一样g/re/p%s/vi/&m/g1,3d/pattern/,$dwqwq工作就像VIM。

命令一样iac进入插入模式。要退出插入模式并返回命令模式,只需输入仅包含的行.。要“移动”到另一行,只需输入行号,与当前行的偏移量(例如+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

编辑:像感恩节提到的那样,可以使用h或激活更多有用的错误消息H。另外,在命令中引用“所有行”的正式方法,不是%在命令的范围内,而是在命令中ed。在GNU中ed%支持使用该功能,但info手册中未提及。%所有行的使用显然是由发明的ex,似乎是因为那里的,意思.,.而不是1,$像那样ed

EDIT2:设置其他编辑器

像提到的其他答案一样,如果要指定其他编辑器,则可以通过设置EDITORVISUAL环境变量来指定。答案中将说明两者之间的区别。

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

EDITOR=vi crontab -e

如果您希望在shell会话中启动的所有程序都使用它,则可以这样:

export EDITOR=vi
crontab -e

您可以分别保存exportin ~/.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
现代版本知道英语错误消息,您只需要使用h它们来询问它们(或H永久启用它)。
grawity

2
(另外,%似乎是一个发明正式。用途,为是指所有的行,即使一些版本接受%为好。)
grawity

这是正确的,但还应提及EDITORVISUAL环境变量。
chrylis -onstroke

中的大多数命令与中的命令ed相同vi,除了不必先按“:”即可退出图形编辑模式。当“真正的程序员”没有使用GUI浪费时间时,我学习了Unix-80x25的“绿屏”终端几乎可以像IBM 029卡片打卡机一样进行编辑,但是效果不尽如人意。)
alephzero

@chrylis EDITORVISUAL没有那么重要。问题基本上是:此编辑器是什么,以及如何使用它?(这是什么0,这是什么?,如何保存?)。
JoL

39

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

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

bashcrontab预期的原始shell,是sh必须已由调用的另一个shell crontab,并且ps是正在运行的ps命令。剩下的ed(由具有相同名称提供)。

如果您不知道如何退出编辑器,则可以使用kill 26302或杀死它kill %1

什么是ed?

埃德(Ed)是一位古老的编辑,其历史可以追溯到显示器是(普通的)东西之前。它是为交互式输出外围设备是电传打印机的计算机设计的。

0它显示在开始是文件中的行数。显然,这是重要的信息。

?表示ed不了解您输入的内容。行式打印机运行缓慢,因此ed不会浪费时间和墨水来显示无意义的信息,例如错误消息。一个老笑话(我不知道起源)流传:

肯·汤普森(Ken Thompson)曾协助设计汽车。与大多数汽车不同,它既没有速度表,也没有汽油表,也没有其他困扰现代驾驶员的笨蛋灯。相反,如果驾驶员犯了一个错误,仪表板中央会显示一个巨大的“?”。汤普森说:“经验丰富的驾驶员通常会知道出了什么问题。”

如果您经验不足,则可以发出命令H(除了一个命令,所有命令都是一个字母(不计算数据参数),因为谁喜欢打字),您会收到错误消息。例如,如果您只按Enter...

?
H
Invalid address

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

如何获得另一位编辑

crontab与大多数运行文本编辑器的命令一样,该命令将检查环境变量,VISUALEDITOR(以该顺序)检查要运行的程序,并恢复为系统默认值。如果这些变量中的任何一个设置为ed,请对其进行更改或删除。

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

update-alternatives --display editor

ed优先级为-100,而所有其他“明智的”编辑器均具有正优先级,因此默认情况下将使用的唯一方法是未安装任何编辑器。Ubuntu的默认安装使用nano作为默认编辑器,优先级为400。如果替代设置为ed,则可以使用进行更改。

sudo update-alternatives --config editor

Gilles,在Ubuntu(以及Debian等)上,系统默认编辑器不应该改成/ etc / alternatives / editor 在Ubuntu(以及Debian等上)上,系统默认编辑器是/ usr / bin / editor吗?
heemayl

非常全面(除非它没有提到EDITOR env变量?但是可能是有目的的,以便人们使用正确的方法通过更新替代方法在系统上进行设置)。也许改变:pspstree -sap $$ ?(更容易确定启动了哪个编辑器,因为它现在是树状格式)
Olivier Dulac

@heemayl /usr/bin/editor是的符号链接/etc/alternatives/editor。应用程序调用的事实/usr/bin/editor是我跳过的一个细节。
吉尔斯(Gillles)“所以-别再作恶了”

3
@OlivierDulac我确实提到EDITORVISUAL。实际上,它们是选择编辑器的正确方法,因为这是用户首选项,而不是系统范围的首选项。我更喜欢坚持ps这里以保持简单。
吉尔斯(Gillles)“所以-别再作恶了”

1
“ ...交互式输出外围设备是行式打印机的计算机。” 行式打印机不是交互式设备,它是一种用于产生大量打印输出的相对高速(且昂贵)的设备。您的意思是“带有键盘的打印终端”,例如电传打字机(也可以用作打孔纸带I / O设备)或IBM“高尔夫球”打字机。
alephzero

12

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

下面的命令将默认的EDITOR设置为 vim

export EDITOR=vim

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

笔记:

  1. 如果愿意,可以选择其他EDITOR作为默认编辑器
  2. 如果要设置默认的编辑器来vim永久,你就必须在上面的命令添加到您~/.bashrc~/.profile或类似的文件。

4

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

EDITOR="vi" crontab -e

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


谢谢一百万!使用EDITOR =“ vi” crontab -e可以正常工作。
justme

3
@gronostaj这与此处发布的任何其他答案都不相同。为单个命令的单个运行设置环境变量与为从当前Shell实例运行的所有后续命令导出环境变量不同。该答案对于永久更改设置很有用,但是对于每次运行控制编辑器来说,这是正确的答案。
伊利亚·卡根

3
确实,知道如何在命令行上添加环境变量非常重要,因为可能不希望永久更改该变量。* nix shell的微妙优势之一是能够轻松地执行此操作。
Monty Harder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.