O que é esse editor que é aberto pelo crontab?

41

Eu quero editar o crontab. Supõe-se que seja Vi, mas não é, como você pode ver:

root@euve252628:~# crontab -e

0

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

?

:wq

?

Sim, isso me deu a ?. E por que isso me dá um zero?

Quando digito a qe pressiono Enter- ele fecha. Eu preciso saber como economizar, porque não é um Vi clássico.

apenas eu
fonte
5
Provavelmente ed: por padrão, fornece uma contagem de caracteres (que em sistemas baseados no Debian é tipicamente 888a primeira vez, sendo o número de caracteres no modelo "vazio" do crontab). Se você estiver vendo uma contagem de 0, deve ter modificado isso. Veja comando crontab -e não está funcionando corretamente
steeldriver
31
ed, cara! ! homem ed: gnu.org/fun/jokes/ed-msg.html
juhist
6
@juhist Em vez de um comentário, esta deve ser a resposta.
dessert
1
Embora você geralmente queira substituir EDITORoutra coisa, se estiver realmente interessado em usar ed, esta é uma ótima introdução: sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov
@justme, a propósito, bem-vindo ao StackExchange! Se você encontrar uma resposta que melhor responda sua pergunta, aceite-a clicando na marca de seleção ao lado.
JOL

Respostas:

65

Isso é ed

Por padrão, seu prompt é a string vazia. Se você quiser sair, basta entrar q. Não prefixe com :. Se você tiver alterações não salvas, ele responderá com ?. Você pode interpretar isso como "você tem certeza?" E confirmar comandando qnovamente. A propósito, qualquer comando que ele não entenda também fará com que ele responda ?. Essa é a única mensagem de erro que ele conhece.

Seus comandos são o que vim / vi / ex / sed baseia-se, por isso, comandos como g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqfuncionam como vim.

Comandos gosto i, ae centrar em modo de inserção. Para sair do modo de inserção e voltar ao modo de comando, basta inserir uma linha que possui apenas a .. Para "mover" para outra linha, basta digitar o número da linha, um deslocamento da linha atual como +2or -1ou um regex como um comando para ir para essa linha. .significa linha atual no modo de comando. Você pode usá-lo para saber onde você está. $significa última linha.

A propósito, se você quiser aprender mais sobre isso, como este é um programa GNU no linux, a maioria de sua documentação está no info edlugar de man ed.

Aqui está uma sessão de exemplo, com comentários adicionados (não aceitos pelo 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: Como menciona grawity, mensagens de erro mais úteis podem ser ativadas com hou H. Além disso, em ,vez de %no intervalo, parte de um comando é a maneira oficial de se referir a "todas as linhas" em ed. No GNU ed, a possibilidade de usar %para isso é suportada, mas não mencionada no infomanual. %Aparentemente ex, o uso de para todas as linhas foi inventado , aparentemente porque, ali, ,significa .,.mais do que 1,$gostar ed.

EDIT2: Definindo um editor diferente

Como outras respostas mencionadas, se você desejar especificar um editor diferente, poderá fazê-lo configurando as variáveis ​​de ambiente EDITORou VISUAL. A diferença entre os dois é explicada nesta resposta .

Você pode fazer isso assim se desejar configurá-lo para um único comando:

EDITOR=vi crontab -e

ou assim, se você quiser que todos os programas iniciados na sessão shell o usem:

export EDITOR=vi
crontab -e

Você pode salvar o exportin ~/.profileou /etc/profile, dependendo se desejar que ele seja uma configuração de usuário ou sistema para o bash, respectivamente. Essa é a maneira portátil unix de definir o editor; você pode fazer isso em qualquer distribuição.

No Ubuntu, também há o update-alternativescomando. O editor padrão atual pode ser visto com update-alternatives --display editor, e você pode usá update-alternatives --config editor-lo para configurá-lo:

$ 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
fonte
2
As versões modernas conhecem as mensagens de erro em inglês, você só precisa hpedir para solicitá-las (ou Hativá-las permanentemente).
grawity
2
(Além disso, %parece ser um ex invenção oficialmente. Ed usos ,para significar todas as linhas, mesmo que algumas versões aceitar %bem.)
grawity
Isso está correto, mas também deve mencionar as variáveis ​​de ambiente EDITORe VISUAL.
precisa saber é o seguinte
A maioria dos comandos in edé igual a in vi, exceto que você não precisa pressionar ":" primeiro para sair do modo de edição gráfica. Eu aprendi Unix quando "programadores reais" não perdeu tempo usando GUIs - um 80x25 "tela verde" funciona terminais quase , bem como um perfurador cartão de IBM 029 para editar, mas não completamente;)
alephzero
@chrylis EDITORe VISUALnão são realmente relevantes. A questão era basicamente: o que é esse editor e como eu o uso? (o que é isso 0e isso ?, e como eu salvo?).
Jol
39

Como descobrir o que é este editor

Pressione Ctrl+ Z. Isso suspende o editor e fornece um prompt de shell. No prompt, execute pspara ver quais processos estão em execução neste terminal.

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é o shell original, crontabé esperado, shé outro shell que deve ter sido chamado crontabe psé o pscomando running . Isso sai ed(fornecido pelo pacote com o mesmo nome ).

Se você não conseguir descobrir como sair do editor, poderá matá-lo neste momento, com kill 26302ou kill %1.

O que é ed?

Ed é um editor antigo, que data de antes dos monitores serem uma coisa (comum). Foi projetado para computadores cujo periférico de saída interativa era um teleprinter .

O que 0é exibido no início é o número de linhas no arquivo. Evidentemente, essa é uma informação importante.

?significa que ed não entendeu o que você digitou. As impressoras em linha são lentas, portanto, a edição não desperdiça tempo e tinta para exibir informações inúteis, como mensagens de erro. Uma piada antiga (não sei a origem) diz:

Ken Thompson tem um automóvel que ajudou a projetar. Ao contrário da maioria dos automóveis, ele não possui velocímetro, medidor de gasolina nem outras luzes idiotas que assolam o motorista moderno. Em vez disso, se o motorista cometer um erro, um gigante “?” Acenderá no centro do painel. "O motorista experiente", diz Thompson, "geralmente sabe o que está errado".

Se você se sentir inexperiente, poderá emitir o comando H(todos os comandos, exceto um, são uma única letra (sem contar os argumentos dos dados), porque quem gosta de digitar) e receberá mensagens de erro. Por exemplo, se você pressionar Enter

?
H
Invalid address

Claro, não é? (Uma linha vazia é o comando vazio - aquele que não é uma única letra. O comando vazio passa para a próxima linha e a imprime. Se você estiver no final do arquivo, que é sempre o caso em um vazio arquivo, não há linha seguinte; portanto, o endereço para o qual você solicitou a mudança é inválido.)

Como obter outro editor

O crontabcomando, como a maioria dos comandos que executam um editor de texto, verifica as variáveis ​​de ambiente VISUALe EDITOR(nessa ordem) para decidir qual programa executar, retornando ao padrão do sistema. Se uma dessas variáveis ​​estiver configurada como ed, altere-a ou remova-a.

No Ubuntu (e Debian e outros), o editor padrão do sistema é /etc/alternatives/editor, que é gerenciado através do mecanismo de alternativas . Por padrão, ele escolhe o melhor editor instalado, onde o melhor é definido pelas prioridades definidas pelos mantenedores de pacotes. Use update-alternativespara configurar uma alternativa. Você pode exibir os editores disponíveis e suas prioridades com

update-alternatives --display editor

edtem a prioridade -100, enquanto todos os outros editores “sensíveis” têm uma prioridade positiva, portanto, a única maneira de ser usada por padrão é se nenhum editor tiver sido instalado. Uma instalação padrão do Ubuntu usa o nano como editor padrão, com prioridade 400. Se a alternativa foi definida como ed, você pode alterá-lo com

sudo update-alternatives --config editor
Gilles 'SO- parar de ser mau'
fonte
Gilles, No Ubuntu (e Debian e outros), o editor padrão do sistema é / etc / alternative / editor reformulado para No Ubuntu (e Debian e outros), o editor padrão do sistema é / usr / bin / editor ?
heemayl
bastante abrangente (exceto que não menciona a variável env do EDITOR? mas talvez de propósito, para que as pessoas usem a maneira correta de configurá-lo no sistema por meio de alternativas de atualização). Talvez mude no entanto: pscom pstree -sap $$ ? (mais fácil de descobrir qual o editor foi lançado, como é agora em formato de árvore)
Olivier Dulac
@heemayl /usr/bin/editoré um link simbólico para /etc/alternatives/editor. O fato de os aplicativos ligarem /usr/bin/editoré um detalhe que eu pulei.
Gilles 'SO- stop be evil'
3
@OlivierDulac eu menciono EDITORe VISUAL. Na verdade, eles são a maneira correta de escolher um editor, pois essa é uma preferência do usuário, não uma preferência do sistema. Eu prefiro ficar psaqui para manter as coisas simples.
Gilles 'SO- stop be evil'
1
"... computadores cujo periférico de saída interativa era uma impressora de linha". Uma impressora de linha não era um dispositivo interativo - era um dispositivo de velocidade relativamente alta (e caro) para produzir grandes quantidades de impressões. Você quer dizer "um terminal de impressão com um teclado", como um teletipo (que também pode funcionar como um dispositivo de E / S de fita de papel perfurada) ou uma máquina de escrever IBM "bola de golfe".
alephzero
12

Da sua pergunta, parece que o seu EDITOR padrão não é vime você tem problemas com o editor padrão atual.

O comando abaixo definirá o EDITOR padrão como vim

export EDITOR=vim

Depois de definir o editor padrão vim, a execução crontab -eserá usada vimcomo seu editor.

Notas:

  1. Se preferir, você pode escolher EDITOR diferente como seu editor padrão
  2. Se você deseja definir o editor padrão vimpermanentemente, precisará adicionar o comando acima ao seu arquivo ~/.bashrcou ~/.profileou similar.
Yaron
fonte
4

Para usar o editor VI para editar o crontab, use o comando abaixo.

EDITOR="vi" crontab -e

ou, se você quiser editar com outro editor, como gedit, nano, etc., basta substituir vi pelo nome do editor.

harsha
fonte
Thanx um milhão! Com o EDITOR = "vi" crontab -e, ele funciona.
justme
3
@gronostaj Não é o mesmo que qualquer outra resposta postada aqui. Definir uma variável de ambiente para uma única execução de um único comando não é o mesmo que exportá-la para todos os comandos subsequentes executados a partir da instância atual do shell. Essa resposta é útil para alterar a configuração permanentemente, mas para controlar o editor por execução, esta é a resposta correta.
Eliah Kagan
3
De fato, saber como acrescentar variáveis ​​de ambiente na linha de comando é muito importante, pois alterar a variável permanentemente pode ser indesejável. Uma das forças sutis das conchas * nix é a capacidade de fazer isso tão facilmente.
Monty Harder