Co to jest ten edytor, który otwiera crontab?

41

Chcę edytować crontab. To ma być Vi, ale nie jest, jak widać:

root@euve252628:~# crontab -e

0

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

?

:wq

?

Tak, dało mi to ?. I dlaczego daje mi zero?

Kiedy piszę a qi naciskam Enter- wychodzi. Muszę wiedzieć, jak oszczędzać, bo to nie jest klasyczna Vi.

tylko ja
źródło
5
Najprawdopodobniej ed: domyślnie podaje liczbę znaków (która w systemach opartych na Debianie jest zwykle 888po raz pierwszy, czyli liczba znaków w szablonie „pustym” crontabie). Jeśli widzisz liczbę 0, musisz ją zmodyfikować. Zobacz komenda Crontab -e nie działa poprawnie
steeldriver,
31
ed, stary! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist
6
@juhist Zamiast tego komentarza powinna być odpowiedź.
deser
1
Chociaż zwykle chcesz po prostu zastąpić EDITORcoś innego, jeśli jesteś zainteresowany faktycznym użyciem ed, jest to świetne wprowadzenie: sanctum.geek.nz/arabesque/actally-using-ed
Xiong Chiamiov
Nawiasem mówiąc, witaj w StackExchange! Jeśli znajdziesz odpowiedź, która najlepiej odpowiada na twoje pytanie, możesz ją zaakceptować, klikając znacznik wyboru obok niej.
JoL

Odpowiedzi:

65

Jest to ed

Domyślnie jego monitem jest pusty ciąg. Jeśli chcesz wyjść, po prostu wpisz q. Nie prefiks z :. Jeśli masz niezapisane zmiany, odpowie na nie ?. Możesz to zinterpretować jako „jesteś pewien?” I potwierdzić, qponownie wydając polecenie . Nawiasem mówiąc, każde polecenie, którego nie rozumie, spowoduje również odpowiedź ?. To jedyny znany komunikat o błędzie.

Jego polecenia są co vim / vi / ex / sed jest na podstawie, tak jak komendy g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqpraca, podobnie jak vim.

Polecenia takie jak i, ai cprzejdź do trybu wstawiania. Aby wyjść z trybu wstawiania i wrócić do trybu poleceń, wystarczy wpisać wiersz, który ma tylko znak .. Aby „przejść” do innej linii, wystarczy wprowadzić numer linii, przesunięcie od bieżącej linii, takie jak +2lub -1, lub wyrażenie regularne jako polecenie przejścia do tej linii. .oznacza bieżącą linię w trybie poleceń. Możesz go użyć, aby wiedzieć, gdzie jesteś. $oznacza ostatnią linię.

Nawiasem mówiąc, jeśli chcesz dowiedzieć się więcej o tym, ponieważ jest to program GNU w systemie Linux, większość jego dokumentacji znajduje się info edzamiast man ed.

Oto przykładowa sesja z dodanymi komentarzami (nieakceptowanymi przez 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

EDYCJA: Jak wspomina grawitacja, bardziej pomocne komunikaty o błędach można aktywować za pomocą hlub H. Ponadto, ,zamiast %w części zakresu, jest oficjalnym sposobem na odniesienie się do „wszystkich linii” w ed. W GNU edmożliwość użycia %tego jest obsługiwana, ale nie wspomniana w infoinstrukcji. Wykorzystanie %do wszystkich linii najwyraźniej zostało wymyślone przez ex, najwyraźniej dlatego, że tam są ,środki, .,.a nie 1,$jak w ed.

EDYCJA 2: Ustawianie innego edytora

Podobnie jak inne wspomniane odpowiedzi, jeśli chcesz określić inny edytor, możesz to zrobić, ustawiając zmienne środowiskowe EDITORlub VISUAL. Różnica między nimi została wyjaśniona w tej odpowiedzi .

Możesz to zrobić, jeśli chcesz ustawić to dla pojedynczego polecenia:

EDITOR=vi crontab -e

lub jeśli chcesz, aby wszystkie programy uruchomione w sesji powłoki z niego korzystały:

export EDITOR=vi
crontab -e

Możesz zapisać exportw ~/.profilelub /etc/profile, w zależności od tego, czy chcesz, aby było to ustawienie użytkownika lub systemowe dla bash. To unikalny przenośny sposób na ustawienie edytora; możesz to zrobić w dowolnej dystrybucji.

W Ubuntu istnieje również update-alternativespolecenie. Bieżący domyślny edytor można zobaczyć za pomocą update-alternatives --display editori można update-alternatives --config editorgo ustawić:

$ 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
źródło
2
Nowoczesne wersje znają angielskie komunikaty o błędach, wystarczy użyć, haby o nie poprosić (lub Hna stałe włączyć).
grawity
2
(Również, %wydaje się być ex wynalazek Oficjalnie. Ed zastosowań ,oznaczać wszystkie linie, choć niektóre wersje przyjąć %, jak również.)
grawity
Jest to poprawne, ale należy również wspomnieć o zmiennych środowiskowych EDITORi VISUAL.
Chrylis -on strike-
Większość poleceń w edjest taka sama jak w vi, ale nie musisz najpierw naciskać „:”, aby wyjść z trybu edycji grafiki. Nauczyłem się Uniksa, gdy „prawdziwi programiści” nie tracili czasu na używanie GUI - terminal „zielony ekran” 80x25 działa prawie tak samo dobrze jak dziurkacz do kart IBM 029 do edycji, ale nie do końca;)
alephzero,
@chrylis EDITORi VISUALtak naprawdę nie są tak istotne. Pytanie było w zasadzie: co to jest ten edytor i jak go używać? (co to jest 0i to ?i jak oszczędzać?).
JoL
39

Jak dowiedzieć się, czym jest ten edytor

Naciśnij Ctrl+ Z. Spowoduje to zawieszenie edytora i wyświetlenie monitu powłoki. Po wyświetleniu monitu uruchom, psaby zobaczyć, jakie procesy działają w tym terminalu.

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

bashjest oryginalną powłoką, crontaboczekuje się, shjest kolejną powłoką, która musiała zostać wywołana crontabi psjest działającą pskomendą. To pozostawia ed(dostarczone przez paczkę o tej samej nazwie ).

Jeśli nie możesz dowiedzieć się, jak zamknąć edytor, możesz go zabić w tym momencie za pomocą kill 26302lub kill %1.

Co to jest Ed?

Ed to starożytny redaktor, którego historia sięga jeszcze przedtem, gdy monitory były (powszechne). Został on zaprojektowany dla komputerów, których moc interaktywny obwodowy był dalekopis .

W 0wyświetla na początku to liczba linii w pliku. Widocznie to ważna informacja.

?oznacza, że ​​ed nie rozumiał, co wpisałeś. Drukarki liniowe działają wolno, więc ed nie marnuje czasu i atramentu na wyświetlanie bezsensownych informacji, takich jak komunikaty o błędach. Stary żart (nie znam pochodzenia) brzmi:

Ken Thompson ma samochód, który pomógł zaprojektować. W przeciwieństwie do większości samochodów, nie ma ani prędkościomierza, ani wskaźnika gazu, ani żadnego z wielu innych idiotycznych świateł, które nękają współczesnego kierowcę. Zamiast tego, jeśli kierowca popełni błąd, na środku deski rozdzielczej zapala się gigantyczne „?”. „Doświadczony kierowca”, mówi Thompson, „zwykle wie, co jest nie tak”.

Jeśli czujesz się niedoświadczony, możesz wydać polecenie H(wszystkie polecenia oprócz jednej są pojedynczą literą (nie licząc argumentów danych), ponieważ kto lubi pisać), a otrzymasz komunikaty o błędach. Na przykład, jeśli po prostu naciśniesz Enter

?
H
Invalid address

Jasne, prawda? (Pusta linia to pusta komenda - ta, która nie jest pojedynczą literą. Puste polecenie przechodzi do następnej linii i drukuje ją. Jeśli jesteś na końcu pliku, co zawsze ma miejsce w pustym plik, nie ma następnego wiersza, więc adres, na który chcesz się przenieść, jest nieprawidłowy).

Jak zdobyć innego edytora

crontabPolecenia, podobnie jak większość poleceń uruchomić edytor tekstu, należy sprawdzić zmienne środowiskowe VISUALi EDITOR(w tej kolejności), aby zdecydować, który program do biegu, spada z powrotem na domyślne systemu. Jeśli jedna z tych zmiennych jest ustawiona na ed, zmień ją lub usuń.

W systemie Ubuntu (oraz Debian i innych) domyślnym edytorem systemu jest system /etc/alternatives/editorzarządzany za pomocą mechanizmu alternatyw . Domyślnie wybiera „najlepszy” zainstalowany edytor, w którym „najlepszy” jest definiowany przez priorytety ustalone przez opiekunów pakietów. Służy update-alternativesdo konfigurowania alternatywy. Możesz wyświetlić dostępne edytory i ich priorytety za pomocą

update-alternatives --display editor

edma priorytet -100, podczas gdy wszystkie inne „rozsądne” edytory mają pozytywny priorytet, więc jedynym sposobem, w jaki byłby domyślnie używany, jest brak edytora. Domyślna instalacja Ubuntu używa nano jako domyślnego edytora, z priorytetem 400. Jeśli opcja została ustawiona na ed, możesz to zmienić za pomocą

sudo update-alternatives --config editor
Gilles „SO- przestań być zły”
źródło
Gilles, nie powinieneś na Ubuntu (i Debian i inni), domyślnym edytorem systemu jest / etc / alternatives / editor Przeformułować na Na Ubuntu (i Debian i inni), domyślnym edytorem systemu jest / usr / bin / editor ?
heemayl
dość obszerna (poza tym, że nie wspomina o zmiennej EDITOR env? ale może celowo, aby ludzie używali właściwego sposobu, aby ustawić ją w systemie za pomocą alternatywnych aktualizacji). Może jednak zmienić: psz pstree -sap $$ ? (łatwiej jest dowiedzieć się, który edytor został uruchomiony, ponieważ jest teraz w formacie drzewa)
Olivier Dulac
@ heemayl /usr/bin/editorjest dowiązaniem symbolicznym do /etc/alternatives/editor. Fakt, że aplikacje dzwonią, /usr/bin/editorjest szczegółem, który pominąłem.
Gilles „SO- przestań być zły”
3
@OlivierDulac Wspominam EDITORi VISUAL. W rzeczywistości są one właściwym sposobem wyboru edytora, ponieważ jest to preferencja użytkownika, a nie preferencja ogólnosystemowa. Wolę trzymać się pstutaj, aby wszystko było proste.
Gilles „SO- przestań być zły”
1
„... komputery, których interaktywnymi wyjściowymi urządzeniami peryferyjnymi były drukarki liniowe.” Drukarka liniowa nie była urządzeniem interaktywnym - była stosunkowo szybkim (i drogim) urządzeniem do wytwarzania dużych ilości wydruków. Masz na myśli „terminal drukujący z klawiaturą”, taki jak typ teletechniczny (który może również działać jako urządzenie we / wy perforowanej taśmy papierowej) lub maszyna do pisania „golfball” firmy IBM.
alephzero
12

Z twojego pytania wynika, że ​​domyślny EDYTOR nie jest vimi masz problemy z bieżącym domyślnym edytorem.

Poniższe polecenie ustawi domyślny EDYTOR na vim

export EDITOR=vim

Po ustawieniu domyślnego edytora na vimuruchamianie crontab -ebędzie działać vimjako edytor.

Uwagi:

  1. Jeśli wolisz, możesz wybrać innego EDYTORA jako domyślnego edytora
  2. Jeśli chcesz ustawić domyślny edytor vimna stałe, trzeba dodać do powyższego polecenia ~/.bashrclub ~/.profilelub podobnego pliku.
Yaron
źródło
4

Aby użyć edytora VI do edycji crontab, użyj poniższego polecenia.

EDITOR="vi" crontab -e

lub, jeśli chcesz edytować za pomocą innego edytora, takiego jak gedit, nano itp., po prostu zastąp vi nazwą edytora.

harsha
źródło
Dzięki milion! Z EDITOR = "vi" crontab -e działa.
justme
3
@gronostaj To nie jest to samo, co każda inna odpowiedź tutaj zamieszczona. Ustawienie zmiennej środowiskowej dla pojedynczego uruchomienia jednego polecenia nie jest tym samym, co eksportowanie jej dla wszystkich kolejnych poleceń uruchamianych z bieżącej instancji powłoki. Ta odpowiedź jest przydatna do zmiany ustawienia na stałe, ale do kontrolowania edytora na każdym uruchomieniu jest to poprawna odpowiedź.
Eliah Kagan,
3
Rzeczywiście, wiedza o tym, jak wstawiać zmienne środowiskowe w wierszu poleceń, jest bardzo ważna, ponieważ zmiana zmiennej na stałe może być niepożądana. Jedną z subtelnych zalet pocisków * nix jest umiejętność robienia tego tak łatwo.
Monty Harder