Cos'è questo editor che viene aperto da crontab?


41

Voglio modificare crontab. Dovrebbe essere Vi, ma non lo è, come puoi vedere:

root@euve252628:~# crontab -e

0

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

?

:wq

?

Sì, mi ha dato un ?. E perché mi dà uno zero?

Quando digito a qe premo Enter, si chiude. Devo sapere come salvare, perché non è il classico Vi.


5
Molto probabilmente ed: per impostazione predefinita, fornisce un conteggio dei caratteri (che nei sistemi basati su Debian è in genere 888la prima volta, essendo il numero di caratteri nel crontab "vuoto" del modello). Se vedi un conteggio di 0, devi averlo modificato. Vedi il comando Crontab -e non funziona correttamente
steeldriver

31
ed, amico! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist

6
@juhist Piuttosto che un commento, questa dovrebbe essere la risposta.
dessert

1
Mentre di solito vuoi semplicemente sostituire EDITORqualcos'altro, se sei interessato a utilizzare effettivamente ed, questa è una grande introduzione: sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov

@justme, a proposito, benvenuto su StackExchange! Se trovi una risposta che risponda meglio alla tua domanda, puoi accettarla facendo clic sul segno di spunta accanto ad essa.
JoL

Risposte:


65

Quello è ed

Per impostazione predefinita, il suo prompt è la stringa vuota. Se vuoi uscire, basta inserire q. Non aggiungere il prefisso :. Se hai modifiche non salvate, risponderà con ?. Puoi interpretarlo come "ne sei sicuro?" E confermare comandando di qnuovo. A proposito, qualsiasi comando che non comprende causerà anche la sua risposta ?. Questo è l'unico messaggio di errore che conosce.

I suoi comandi sono ciò che vim / vi / ex / sed si basa su, in modo da comandi come g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqfunzionano esattamente come vim.

Comandi come i, ae cvai in modalità inserimento. Per uscire dalla modalità di inserimento e tornare alla modalità di comando, basta inserire una riga che ha solo a .. Per "spostare" su un'altra riga, basta inserire il numero di riga, uno scostamento dalla riga corrente come +2o -1o un regex come comando per passare a quella riga. .indica la riga corrente in modalità comando. Puoi usarlo per sapere dove ti trovi. $significa ultima riga.

A proposito, se vuoi saperne di più, trattandosi di un programma GNU in Linux, la maggior parte della sua documentazione è info edinvece di man ed.

Ecco una sessione di esempio, con commenti aggiunti (non accettati da 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

MODIFICA: Come le menzioni di gravità, è possibile attivare messaggi di errore più utili con ho H. Inoltre, ,piuttosto che %nell'intervallo, la parte di un comando è il modo ufficiale di fare riferimento a "tutte le linee" in ed. In GNU ed, la possibilità di utilizzare %per questo è supportata ma non menzionata nel infomanuale. L'uso di %per tutte le linee è stato apparentemente inventato da ex, apparentemente perché, lì, ,significa .,.piuttosto che 1,$come in ed.

EDIT2: impostazione di un editor diverso

Come altre risposte menzionate, se si desidera specificare un editor diverso, è possibile farlo impostando le variabili di ambiente EDITORo VISUAL. La differenza tra i due è spiegata in questa risposta .

Puoi farlo in questo modo se vuoi impostarlo per un singolo comando:

EDITOR=vi crontab -e

o in questo modo se si desidera che tutti i programmi avviati nella sessione di shell lo utilizzino:

export EDITOR=vi
crontab -e

È possibile salvare exportin ~/.profileo /etc/profile, a seconda se si desidera che sia un'impostazione utente o di sistema per bash, rispettivamente. Questo è il modo portatile unix per impostare l'editor; puoi farlo in qualsiasi distribuzione.

In Ubuntu c'è anche il update-alternativescomando. L'editor predefinito corrente può essere visualizzato con update-alternatives --display editored è possibile utilizzare update-alternatives --config editorper impostarlo:

$ 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
Le versioni moderne conoscono i messaggi di errore in inglese, devi solo usarli hper richiederli (o Hper abilitarli permanentemente).
Grawity,

2
(Inoltre, %sembra essere un ex invenzione Ufficialmente. Ed usi ,per indicare tutte le linee, anche se alcune versioni accettano %pure.)
grawity

Questo è corretto, ma dovrebbe anche menzionare le variabili di ambiente EDITORe VISUAL.
Chrylis

La maggior parte dei comandi in edsono gli stessi di in vi, tranne che non è necessario premere prima ":" per uscire dalla modalità di modifica grafica. Ho imparato Unix quando i "veri programmatori" non hanno perso tempo usando le GUI - un terminale "schermo verde" 80x25 funziona quasi come un pugno della scheda IBM 029 per l'editing, ma non del tutto;)
alephzero

@chrylis EDITORe VISUALnon sono poi così rilevanti. La domanda era fondamentalmente: che cos'è questo editor e come lo uso? (che cos'è questo 0e questo ?e come posso salvare?).
JoL

39

Come scoprire cos'è questo editor

Premi Ctrl+ Z. Questo sospende l'editor e ti dà un prompt della shell. Al prompt, eseguire psper vedere quali processi sono in esecuzione in questo terminale.

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è la shell originale, crontabè previsto, shè un'altra shell che deve essere stata invocata crontabed psè il pscomando in esecuzione . Ciò lascia ed(fornito dal pacchetto con lo stesso nome ).

Se non riesci a capire come uscire dall'editor, puoi ucciderlo a questo punto, con kill 26302o kill %1.

Cosa è ed?

Ed è un editore antico, risalente a prima che i monitor fossero una cosa (banale). È stato progettato per computer la cui periferica di output interattiva era una teleprinter .

Le 0da visualizzarla con l'inizio è il numero di righe nel file. Evidentemente sono informazioni importanti.

?significa che ed non ha capito cosa hai digitato. Le stampanti di linea sono lente, quindi non spreca tempo e inchiostro per visualizzare informazioni inutili come messaggi di errore. Un vecchio scherzo (non conosco l'origine) dice:

Ken Thompson ha un'automobile che ha aiutato a progettare. A differenza della maggior parte delle automobili, non ha né tachimetro, né indicatore del gas, né nessuna delle altre numerose luci idiota che affliggono il guidatore moderno. Piuttosto, se il guidatore fa un errore, un "?" Gigante si illumina al centro del cruscotto. "Il conducente esperto", afferma Thompson, "di solito sa cosa c'è che non va."

Se ti senti inesperto, puoi emettere il comando H(tutti i comandi tranne uno sono una sola lettera (senza contare gli argomenti dei dati), perché a chi piace digitare), e otterrai messaggi di errore. Ad esempio, se premi semplicemente Enter...

?
H
Invalid address

Chiaro, vero? (Una riga vuota è il comando vuoto - quella che non è una singola lettera. Il comando vuoto passa alla riga successiva e la stampa. Se sei alla fine del file, che è sempre il caso in una riga vuota file, non esiste una riga successiva, quindi l'indirizzo a cui hai richiesto di spostare non è valido.)

Come ottenere un altro editor

Il crontabcomando, come la maggior parte dei comandi che eseguono un editor di testo, controlla le variabili di ambiente VISUALe EDITOR(in quell'ordine) per decidere quale programma eseguire, tornando ai valori predefiniti del sistema. Se una di queste variabili è impostato ed, il cambiamento o rimuoverlo.

Su Ubuntu (e Debian e altri), l'editor predefinito di sistema è /etc/alternatives/editor, che è gestito attraverso il meccanismo delle alternative . Per impostazione predefinita, seleziona l'editor "migliore" installato, dove "migliore" è definito dalle priorità stabilite dai manutentori del pacchetto. Utilizzare update-alternativesper configurare un'alternativa. Puoi visualizzare gli editor disponibili e le loro priorità con

update-alternatives --display editor

edha la priorità -100, mentre tutti gli altri editor "sensibili" hanno una priorità positiva, quindi l'unico modo in cui verrebbe utilizzato di default è se nessun editor è stato installato. Un'installazione predefinita di Ubuntu utilizza nano come editor predefinito, con priorità 400. Se l'alternativa è stata impostata su ed, è possibile modificarla con

sudo update-alternatives --config editor

Gilles, non dovrebbe su Ubuntu (e Debian e altri), l'editor predefinito di sistema è / etc / alternatives / editor dovrebbe essere riformulato su Su Ubuntu (e Debian e altri), l'editor predefinito di sistema è / usr / bin / editor ?
heemayl,

abbastanza completo (tranne che non menziona la variabile env di EDITOR? ma forse di proposito, in modo che le persone utilizzino il modo corretto di impostarlo sul sistema tramite update-alternative). Forse cambieresti comunque: pscon pstree -sap $$ ? (più facile capire quale editor è stato lanciato, dato che ora è in un formato ad albero)
Olivier Dulac,

@heemayl /usr/bin/editorè un link simbolico a /etc/alternatives/editor. Il fatto che le applicazioni chiamino /usr/bin/editorè un dettaglio che ho ignorato.
Gilles 'SO- smetti di essere malvagio' il

3
@OlivierDulac menziono EDITORe VISUAL. Sono in effetti il ​​modo corretto di scegliere un editor poiché questa è una preferenza dell'utente, non una preferenza a livello di sistema. Preferisco attenermi a psqui per mantenere le cose semplici.
Gilles 'SO- smetti di essere malvagio' il

1
"... computer la cui periferica di output interattiva era una stampante di linea." Una stampante di linea non era un dispositivo interattivo: era un dispositivo a velocità relativamente elevata (e costoso) per produrre grandi quantità di stampe. Intendi "un terminale di stampa con una tastiera", come un teletipo (che potrebbe anche funzionare come un dispositivo I / O di nastro di carta perforato) o una macchina da scrivere "golfball" IBM.
alephzero,

12

Dalla tua domanda sembra che il tuo EDITOR predefinito non lo sia vim, e hai problemi con l'attuale editor predefinito.

Il comando seguente imposterà EDITOR predefinito su vim

export EDITOR=vim

Dopo aver impostato l'editor predefinito come vim, l'esecuzione crontab -everrà utilizzato vimcome editor.

Gli appunti:

  1. Se preferisci, puoi scegliere EDITOR diverso come editor predefinito
  2. Se si desidera impostare l'editor predefinito per vimin modo permanente, si dovrà aggiungere il comando sopra al vostro ~/.bashrco ~/.profileo simili file.

4

Per utilizzare l'editor VI per modificare crontab, utilizzare il comando seguente.

EDITOR="vi" crontab -e

oppure, se si desidera modificare con un altro editor come gedit, nano, ecc., sostituire vi con il nome dell'editor.


Grazie mille! Con EDITOR = "vi" crontab -e funziona.
Justme,

3
@gronostaj Questa non è la stessa di qualsiasi altra risposta che è stata pubblicata qui. L'impostazione di una variabile di ambiente per una singola esecuzione di un singolo comando non è la stessa dell'esportazione per tutti i comandi successivi eseguiti dall'istanza della shell corrente. Questa risposta è utile per modificare l'impostazione in modo permanente, ma per controllare l'editor per esecuzione, questa è la risposta corretta.
Eliah Kagan,

3
In effetti, sapere come anteporre le variabili di ambiente sulla riga di comando è molto importante, poiché la modifica permanente della variabile potrebbe essere indesiderabile. Uno dei punti di forza sottili delle shell * nix è la capacità di farlo così facilmente.
Monty Harder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.