Что это за редактор, который открывается crontab?

40

Я хочу отредактировать crontab. Предполагается, что это Vi, но это не так, как вы можете видеть:

[email protected]:~# crontab -e

0

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

?

:wq

?

Да, это дало мне ? . И почему это дает мне ноль?

Когда я набираю q и нажимаю Enter - он завершает работу. Мне нужно знать, как сэкономить, потому что это не классический Vi.

    
задан justme 11.09.2017 в 14:28
источник

4 ответа

64

Это 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 , или регулярное выражение в качестве команды для перехода к этой строке. . означает текущую строку в командном режиме. Вы можете использовать его, чтобы знать, где вы находитесь. $ означает последнюю строку.

Кстати, если вы хотите узнать больше об этом, это будет GNU-программа в Linux, большая часть ее документации находится в 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

EDIT: как упоминания о грамотности, более полезные сообщения об ошибках могут быть активированы с помощью h или H . Кроме того, , , а не % в части диапазона команды, является официальным способом ссылаться на «все строки» в ed . В GNU ed возможность использования % для этого поддерживается, но не указана в руководстве info . Использование % для всех строк было, по-видимому, изобретено ex , похоже, потому что там , означает .,. , а не 1,$ , как в ed .

EDIT2: установка другого редактора

Как и другие упомянутые ответы, если вы хотите указать другой редактор, вы можете сделать это, установив переменные среды EDITOR или VISUAL . Разница между ними объясняется в этом ответе .

Вы можете сделать это так, если хотите установить его для одной команды:

EDITOR=vi crontab -e

или как это, если вы хотите, чтобы все программы, запущенные в сеансе оболочки, использовали его:

export EDITOR=vi
crontab -e

Вы можете сохранить export в ~/.profile или /etc/profile , в зависимости от того, хотите ли вы быть пользователем или системным параметром для bash, соответственно. Это универсальный переносной способ установки редактора; вы можете сделать это в любом дистрибутиве.

В 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.
    
ответ дан JoL 11.09.2017 в 18:29
38

Как узнать, что этот редактор

Нажмите Ctrl + Z . Это приостанавливает редактор и дает вам приглашение оболочки. В командной строке запустите 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 - это исходная оболочка, ожидается crontab , sh - это еще одна оболочка, которая должна быть вызвана crontab , а ps - это команда ps . Это оставляет ed (предоставлено пакет с таким же именем ).

Если вы не можете понять, как выйти из редактора, вы можете убить его в этот момент, kill 26302 или kill %1 .

Что называется?

Эд - древний редактор, начиная с до того, как мониторы были (обычным). Он был разработан для компьютеров, интерактивная периферия которых была телеприемником .

0 , отображаемое в начале, - это количество строк в файле. Очевидно, это важная информация.

? означает, что 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
    
ответ дан Gilles 11.09.2017 в 21:54
12

Из вашего вопроса кажется, что ваш EDITOR по умолчанию не является vim , и у вас проблемы с текущим редактором по умолчанию.

В приведенной ниже команде будет установлен EDITOR по умолчанию vim

export EDITOR=vim

После установки редактора по умолчанию vim , запуск crontab -e будет использовать vim в качестве вашего редактора.

Примечания:

  1. Если вы предпочитаете, вы можете выбрать другой EDITOR в качестве редактора по умолчанию
  2. Если вы хотите окончательно установить редактор по умолчанию на vim , вам придется добавить указанную выше команду в ваш файл ~/.bashrc или ~/.profile или аналогичный файл.
ответ дан Yaron 11.09.2017 в 14:37
4

Чтобы использовать редактор VI для редактирования crontab, используйте приведенную ниже команду.

EDITOR="vi" crontab -e

или, если вы хотите редактировать с помощью другого редактора, такого как gedit, nano и т. д. просто замените vi именем редактора.

    
ответ дан harsha 11.09.2017 в 14:42