O que é esse editor que é aberto pelo crontab?

40

Eu quero editar o crontab. É suposto ser Vi, mas não é, como você pode ver:

[email protected]:~# crontab -e

0

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

?

:wq

?

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

Quando eu digito um q e pressiono Enter - ele sai. Eu preciso saber como salvar, porque não é clássico Vi.

    
por justme 11.09.2017 / 14:28

4 respostas

64

Isso é ed

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

Seus comandos são baseados no vim / vi / ex / sed, portanto, comandos como g/re/p , %s/vi/&m/g , 1,3d , /pattern/,$d , w , q , wq funcionam apenas como vim.

Comandos como i , a e c entram no modo de inserção. Para sair do modo de inserção e voltar ao modo de comando, basta digitar uma linha que tenha apenas . . Para "mover" para outra linha, basta digitar o número da linha, um deslocamento da linha atual como +2 ou -1 ou 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 a última linha.

A propósito, se você quiser aprender mais sobre isso, sendo este um programa GNU no linux, a maior parte de sua documentação está em info ed ao invés 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 as menções de grawity, mensagens de erro mais úteis podem ser ativadas com h ou H . Além disso, , em vez de % na parte do intervalo 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 manual info . O uso de % para todas as linhas foi aparentemente inventado por ex , aparentemente porque, lá, , significa .,. em vez de 1,$ como em ed .

EDIT2: Configurando um editor diferente

Assim como outras respostas mencionadas, se você quiser especificar um editor diferente, poderá fazê-lo definindo as variáveis de ambiente EDITOR ou VISUAL . A diferença entre os dois é explicada em esta resposta .

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

EDITOR=vi crontab -e

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

export EDITOR=vi
crontab -e

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

No Ubuntu, há também o comando update-alternatives . O editor padrão atual pode ser visto com update-alternatives --display editor e você pode usar update-alternatives --config editor para defini-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.
    
por JoL 11.09.2017 / 18:29
38

Como descobrir o que este editor é

Pressione Ctrl + Z . Isso suspende o editor e fornece um prompt de shell. No prompt, execute ps para ver quais processos estão sendo executados 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 invocado por crontab e ps é o comando ps em execução. Isso deixa ed (fornecido pelo pacote com o mesmo nome ).

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

O que é ed?

Ed é um editor antigo, datado de antes de os monitores serem uma coisa (comum). Ele foi projetado para computadores cujo periférico de saída interativo era um teleprinter .

O 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 de linha são lentas, portanto, o ed não desperdiça tempo e tinta para exibir informações sem sentido, como mensagens de erro. Uma velha piada (não sei a origem) diz:

  

Ken Thompson tem um automóvel que ajudou a projetar. Ao contrário da maioria dos automóveis, não tem nem velocímetro, nem medidor de gás, nem qualquer outra das inúmeras luzes idiotas que assolam o motorista moderno. Em vez disso, se o motorista cometer um erro, um gigante “?” Acende-se 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 de dados), porque quem gosta de digitar) e receberão mensagens de erro. Por exemplo, se você pressionar Enter

?
H
Invalid address

Claro, não é? (Uma linha vazia é o comando vazio - o que não é uma única letra. O comando vazio se move para a próxima linha e imprime. Se você está no final do arquivo, o que é sempre o caso em um vazio arquivo, não há próxima linha, então o endereço para o qual você pediu para mover é inválido.)

Como conseguir outro editor

O comando crontab , como a maioria dos comandos que executam um editor de texto, verifica as variáveis de ambiente VISUAL e EDITOR (nessa ordem) para decidir qual programa executar, voltando ao padrão do sistema. Se qualquer uma dessas variáveis estiver definida 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 alternativo . Por padrão, ele escolhe o “melhor” editor instalado, onde “melhor” é definido pelas prioridades definidas pelos mantenedores do pacote. Use update-alternatives para configurar uma alternativa. Você pode exibir os editores disponíveis e suas prioridades com

update-alternatives --display editor

ed tem a prioridade -100, enquanto todos os outros editores "sensatos" têm uma prioridade positiva, então a única maneira que seria 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
    
por Gilles 11.09.2017 / 21:54
12

Da sua pergunta, parece que seu EDITOR padrão não é vim e 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 como vim , a execução de crontab -e usará vim como seu editor.

Notas:

  1. Se preferir, você pode escolher EDITOR diferente como editor padrão
  2. Se você quiser definir o editor padrão como vim permanentemente, será necessário adicionar o comando acima ao seu ~/.bashrc ou ~/.profile ou arquivo semelhante.
por Yaron 11.09.2017 / 14:37
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., apenas substitua vi pelo nome do editor.

    
por harsha 11.09.2017 / 14:42