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

41

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

root@euve252628:~# crontab -e

0

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

?

:wq

?

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

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

просто я
источник
5
Скорее всего ed: по умолчанию он дает количество символов (которое в системах на основе Debian обычно 888является первым, это количество символов в шаблоне «пустой» crontab). Если вы видите счет 0, вы, должно быть, изменили это. См., Что команда Crontab -e не работает должным образом
steeldriver
31
Эд, чувак! ! Человек - й изд: gnu.org/fun/jokes/ed-msg.html
juhist
6
@juhist Вместо комментария это должно быть ответ.
десерт
1
Хотя вы обычно хотите просто переопределить EDITORчто-то другое, если вы действительно хотите использовать ed, это отличное введение: sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov
@justme, кстати, добро пожаловать в StackExchange! Если вы найдете ответ, который лучше всего отвечает на ваш вопрос, вы можете принять его, нажав на галочку рядом с ним.
JoL

Ответы:

65

Это ed

По умолчанию его подсказка является пустой строкой. Если вы хотите выйти, просто введите q. Не префикс с :. Если у вас есть несохраненные изменения, он ответит с ?. Вы можете интерпретировать это как «Вы уверены?», И подтвердить, qснова командуя . Кстати, любая команда, которую она не понимает, также вызовет ответ ?. Это единственное сообщение об ошибке, которое он знает.

Его команда , что ВЬЕТ / VI / ех / СЕПГ основан на, так команды типа g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqработает так же , как Vim.

Команды, как i, aи cперейти в режим вставки. Чтобы выйти из режима вставки и вернуться в командный режим, просто введите строку, которая имеет только a .. Чтобы «переместиться» на другую строку, просто введите номер строки, смещение от текущей строки, например +2или -1, или регулярное выражение в качестве команды для перехода на эту строку. .означает текущую строку в командном режиме. Вы можете использовать это, чтобы знать, где вы находитесь. $означает последнюю строку.

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

РЕДАКТИРОВАТЬ 2: Установка другого редактора

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

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

EDITOR=vi crontab -e

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

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
Современные версии знают сообщения об ошибках на английском языке, вам просто нужно использовать их, hчтобы запросить их (или Hвключить их постоянно).
бесплатный
2
(Кроме того , как %представляется, является бывший изобретение официально. Е изд использование ,означает все строки, хотя некоторые версии работают %так же.)
grawity
Это правильно, но следует также упомянуть переменные среды EDITORи VISUAL.
Хрилис-на забастовке-
Большинство команд edте же, что и in vi, за исключением того, что вам не нужно сначала нажимать «:», чтобы выйти из режима графического редактирования. Я изучил Unix, когда «настоящие программисты» не тратили время на использование графического интерфейса - терминал «зеленый экран» 80x25 работает почти так же хорошо, как перфоратор карты IBM 029 для редактирования, но не совсем;)
alephzero
@ chrylis EDITORи VISUALне очень то актуально. Вопрос был в основном: что это за редактор и как его использовать? (что это 0и это ?, и как мне сохранить?).
JoL
39

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

Нажмите 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
Жиль "ТАК - перестань быть злым"
источник
Жиль, разве не в Ubuntu (и Debian и других) системный редактор по умолчанию переименован в / etc / alternatives / editor в Ubuntu (и в Debian и других), системный редактор по умолчанию / usr / bin / editor ?
Heemayl
довольно всеобъемлющий (за исключением того, что он не упоминает переменную EDITOR env? но, может быть, специально, чтобы люди использовали правильный способ установки его в системе с помощью альтернативных обновлений). Может быть, измениться: psс pstree -sap $$ ? (проще выяснить, какой редактор был запущен, так как он теперь в древовидном формате)
Оливье Дюлак
@heemayl /usr/bin/editor- символическая ссылка на /etc/alternatives/editor. Тот факт, что приложения вызывают, /usr/bin/editorявляется деталью, которую я пропустил.
Жиль "ТАК - перестань быть злым"
3
@OlivierDulac Я упоминаю EDITORи VISUAL. На самом деле они являются правильным способом выбора редактора, поскольку это предпочтение пользователя, а не общесистемное предпочтение. Я предпочитаю придерживаться psздесь, чтобы все было просто.
Жиль "ТАК - перестань быть злым"
1
«... компьютеры, чье периферийное интерактивное устройство было линейным принтером». Линейный принтер не был интерактивным устройством - это было относительно высокоскоростное (и дорогое) устройство для производства большого количества печатной продукции. Вы имеете в виду «печатный терминал с клавиатурой», такой как телетайп (который также может работать как устройство ввода / вывода с перфорированной бумажной лентой) или печатная машинка IBM «для игры в гольф».
алефзеро
12

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

Приведенная ниже команда установит РЕДАКТОР по умолчанию vim

export EDITOR=vim

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

Заметки:

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

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

EDITOR="vi" crontab -e

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

Харша
источник
Спасибо миллион! С редактором = "vi" crontab -e это работает.
Justme
3
@gronostaj Это не то же самое, что любой другой ответ, который был размещен здесь. Задание переменной среды для одного запуска одной команды отличается от ее экспорта для всех последующих команд, запущенных из текущего экземпляра оболочки. Этот ответ полезен для постоянного изменения настроек, но для правильного управления редактором это правильный ответ.
Элия ​​Каган
3
Действительно, очень важно знать, как добавлять переменные окружения в командную строку, так как постоянное изменение переменной может быть нежелательным. Одной из слабых сторон оболочек * nix является возможность сделать это так легко.
Монти Хардер