Apa editor ini yang dibuka oleh crontab?

41

Saya ingin mengedit crontab. Seharusnya Vi, tapi tidak, seperti yang Anda lihat:

root@euve252628:~# crontab -e

0

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

?

:wq

?

Ya, itu memberi saya ?. Dan mengapa itu memberi saya nol?

Ketika saya mengetik a qdan tekan Enter- itu berhenti. Saya perlu tahu bagaimana cara menyimpan, karena itu bukan Vi klasik.

hanya aku
sumber
5
Kemungkinan besar ed: secara default, ini memberikan jumlah karakter (yang dalam sistem berbasis Debian biasanya 888pertama kali, menjadi jumlah karakter dalam templat "kosong" crontab). Jika Anda melihat hitungan 0, Anda harus mengubahnya. Lihat perintah Crontab -e tidak berfungsi dengan baik
steeldriver
31
ed, bung! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist
6
@juhist Daripada komentar ini harus yang jawabannya.
hidangan penutup
1
Meskipun Anda biasanya hanya ingin mengganti EDITORke yang lain, jika Anda tertarik untuk benar-benar menggunakan ed, ini adalah pengantar yang bagus: sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov
@ justme, omong-omong, selamat datang di StackExchange! Jika Anda menemukan jawaban yang paling menjawab pertanyaan Anda, Anda dapat menerimanya dengan mengklik tanda centang di sebelahnya.
JoL

Jawaban:

65

Itu ed

Secara default promptnya adalah string kosong. Jika Anda ingin berhenti, cukup masukkan q. Jangan awali dengan :. Jika Anda memiliki perubahan yang belum disimpan, itu akan membalas dengan ?. Anda dapat menafsirkannya sebagai "Anda yakin?", Dan mengonfirmasi dengan memerintahkan qlagi. Ngomong-ngomong, perintah apa pun yang tidak dimengerti juga akan menyebabkannya membalas ?. Itulah satu-satunya pesan kesalahan yang diketahuinya.

Perintah nya adalah apa vim / vi / ex / sed didasarkan pada, sehingga perintah seperti g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqbekerja sama seperti vim.

Perintah suka i,, adan cmasuk ke mode insert. Untuk meninggalkan mode penyisipan dan kembali ke mode perintah, cukup masukkan baris yang hanya memiliki a .. Untuk "pindah" ke baris lain, cukup masukkan nomor baris, offset dari baris saat ini seperti +2atau -1, atau regex sebagai perintah untuk pergi ke baris itu. .berarti baris saat ini dalam mode perintah. Anda dapat menggunakannya untuk mengetahui di mana Anda berada. $berarti baris terakhir.

Ngomong-ngomong, jika Anda ingin mempelajari lebih lanjut tentang hal ini, ini adalah program GNU di linux, sebagian besar dokumentasinya ada di info edbukan man ed.

Berikut adalah contoh sesi, dengan komentar yang ditambahkan (tidak diterima oleh 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: Seperti grawity menyebutkan, pesan kesalahan yang lebih bermanfaat dapat diaktifkan dengan hatau H. Juga, ,alih-alih %di bagian jangkauan perintah adalah cara resmi untuk merujuk ke "semua baris" di ed. Dalam GNU ed, kemungkinan untuk menggunakan %ini didukung tetapi tidak disebutkan dalam infomanual. Penggunaan %untuk semua lini tampaknya diciptakan oleh ex, tampaknya karena, di sana, ,berarti .,.daripada 1,$seperti di ed.

EDIT2: Mengatur editor yang berbeda

Seperti jawaban lain yang disebutkan, jika Anda ingin menentukan editor yang berbeda, Anda dapat melakukannya dengan mengatur variabel lingkungan EDITORatau VISUAL. Perbedaan antara keduanya dijelaskan dalam jawaban ini .

Anda dapat melakukannya seperti ini jika Anda ingin mengaturnya untuk satu perintah:

EDITOR=vi crontab -e

atau seperti ini jika Anda ingin semua program diluncurkan di sesi shell untuk menggunakannya:

export EDITOR=vi
crontab -e

Anda dapat menyimpan exportdalam ~/.profileatau /etc/profile, tergantung apakah Anda ingin menjadi pengguna atau pengaturan sistem untuk bash, masing-masing. Itulah cara portabel unix untuk mengatur editor; Anda dapat melakukan ini dalam distribusi apa pun.

Di Ubuntu, ada juga update-alternativesperintahnya. Editor default saat ini dapat dilihat dengan update-alternatives --display editor, dan Anda dapat menggunakannya update-alternatives --config editoruntuk mengaturnya:

$ 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
sumber
2
Versi modern tahu pesan kesalahan dalam Bahasa Inggris, Anda hanya perlu menggunakannya huntuk memintanya (atau Huntuk mengaktifkannya secara permanen).
grawity
2
(Juga, %tampaknya merupakan penemuan ex . Secara resmi ed menggunakan ,berarti semua baris, meskipun beberapa versi menerima %juga.)
grawity
Ini benar tetapi harus juga menyebutkan variabel EDITORdan VISUALlingkungan.
chrylis -on strike-
Sebagian besar perintah dalam edsama dengan di vi, kecuali Anda tidak harus menekan ":" terlebih dahulu untuk keluar dari mode pengeditan grafis. Saya belajar Unix ketika "programmer nyata" tidak membuang-buang waktu menggunakan GUI - terminal "layar hijau" 80x25 bekerja hampir serta pukulan kartu IBM 029 untuk mengedit, tetapi tidak cukup;)
alephzero
@chrylis EDITORdan VISUALtidak terlalu relevan. Pertanyaannya adalah pada dasarnya: apa editor ini, dan bagaimana cara menggunakannya? (apa ini 0dan ini ?, dan bagaimana cara menyimpan?).
JoL
39

Cara mengetahui apa itu editor ini

Tekan Ctrl+ Z. Ini menangguhkan editor dan memberi Anda prompt shell. Saat diminta, jalankan psuntuk melihat proses apa yang sedang berjalan di terminal ini.

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

bashadalah shell asli, crontabdiharapkan, shadalah shell lain yang harus dipanggil oleh crontab, dan psmerupakan psperintah yang berjalan . Itu meninggalkan ed(disediakan oleh paket dengan nama yang sama ).

Jika Anda tidak tahu cara keluar dari editor, Anda dapat membunuhnya pada saat ini, dengan kill 26302atau kill %1.

Apa itu ed?

Ed adalah editor kuno, yang berasal dari sebelum monitor adalah hal yang lumrah. Itu dirancang untuk komputer yang perangkat output interaktifnya adalah teleprinter .

Yang 0ditampilkan di awal adalah jumlah baris dalam file. Jelas itu informasi penting.

?berarti ed tidak mengerti apa yang Anda ketikkan. Line printer lambat, jadi ed tidak membuang waktu dan tinta untuk menampilkan informasi yang tidak berguna seperti pesan kesalahan. Lelucon lama (saya tidak tahu asal usulnya):

Ken Thompson memiliki mobil yang ia bantu desain. Tidak seperti kebanyakan mobil, mobil ini tidak memiliki speedometer, atau pengukur gas, atau lampu idiot lainnya yang mengganggu pengemudi modern. Sebaliknya, jika pengemudi melakukan kesalahan, "?" Raksasa menyala di tengah dashboard. "Pengemudi yang berpengalaman," kata Thompson, "biasanya akan tahu apa yang salah."

Jika Anda merasa tidak berpengalaman, Anda bisa mengeluarkan perintah H(semua perintah kecuali satu adalah satu huruf (tidak termasuk argumen data), karena yang suka mengetik), dan Anda akan mendapatkan pesan kesalahan. Misalnya, jika Anda hanya menekan Enter...

?
H
Invalid address

Jelas bukan? (Baris kosong adalah perintah kosong - baris yang bukan huruf tunggal. Perintah kosong akan pindah ke baris berikutnya dan mencetaknya. Jika Anda berada di akhir file, yang selalu merupakan kasus kosong file, tidak ada baris berikutnya, jadi alamat yang Anda minta tidak valid.)

Cara mendapatkan editor lain

The crontabperintah, seperti kebanyakan perintah yang menjalankan editor teks, memeriksa variabel lingkungan VISUALdan EDITOR(agar) untuk menentukan program untuk dijalankan, jatuh kembali ke sistem default. Jika salah satu dari variabel ini diatur ke ed, ubah atau hapus.

Di Ubuntu (dan Debian dan lainnya), editor default sistem adalah /etc/alternatives/editor, yang dikelola melalui mekanisme alternatif . Secara default ia memilih editor "terbaik" yang diinstal, di mana "terbaik" ditentukan oleh prioritas yang ditetapkan oleh pengelola paket. Gunakan update-alternativesuntuk mengkonfigurasi alternatif. Anda dapat menampilkan editor yang tersedia dan prioritasnya

update-alternatives --display editor

edmemiliki prioritas -100, sedangkan semua editor "masuk akal" lainnya memiliki prioritas positif, jadi satu-satunya cara itu akan digunakan secara default adalah jika tidak ada editor yang diinstal. Instalasi default Ubuntu menggunakan nano sebagai editor default, dengan prioritas 400. Jika alternatif telah diatur ed, Anda dapat mengubahnya dengan

sudo update-alternatives --config editor
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Gilles, Tidak Harus Di Ubuntu (dan Debian dan lainnya), editor default sistem adalah / etc / alternative / editor diulang ke Di Ubuntu (dan Debian dan lainnya), editor default sistem adalah / usr / bin / editor ?
heemayl
cukup komprehensif (kecuali itu tidak menyebutkan variabel env EDITOR? tapi mungkin sengaja, sehingga orang menggunakan cara yang tepat untuk mengaturnya pada sistem melalui pembaruan-alternatif). Namun mungkin berubah: psdengan pstree -sap $$ ? (lebih mudah untuk mengetahui editor mana yang diluncurkan, karena sekarang dalam format pohon)
Olivier Dulac
@heemayl /usr/bin/editoradalah symlink ke /etc/alternatives/editor. Fakta bahwa panggilan aplikasi /usr/bin/editoradalah detail yang saya lewatkan.
Gilles 'SO- stop being evil'
3
@ OlivierDulac saya sebutkan EDITORdan VISUAL. Mereka sebenarnya cara yang tepat untuk memilih editor karena ini adalah preferensi pengguna, bukan preferensi seluruh sistem. Saya lebih suka tetap di pssini untuk menjaga hal-hal sederhana
Gilles 'SO- stop being evil'
1
"... komputer yang periferal output interaktifnya adalah printer garis." Sebuah printer garis bukanlah perangkat interaktif - itu adalah perangkat yang relatif tinggi (dan mahal) untuk menghasilkan sejumlah besar hasil cetak. Maksud Anda "terminal pencetakan dengan keyboard", seperti teletype (yang juga bisa berfungsi sebagai perangkat I / O pita kertas yang dilubangi) atau mesin ketik IBM "bola golf".
alephzero
12

Dari pertanyaan Anda, sepertinya EDITOR default Anda tidak vim, dan Anda memiliki masalah dengan editor default saat ini.

Perintah di bawah ini akan mengatur EDITOR default menjadi vim

export EDITOR=vim

Setelah mengatur editor default menjadi vim, menjalankan crontab -eakan digunakan vimsebagai editor Anda.

Catatan:

  1. Jika Anda suka, Anda dapat memilih EDITOR yang berbeda sebagai editor default Anda
  2. Jika Anda ingin mengatur editor default untuk vimsecara permanen, Anda harus menambahkan perintah di atas untuk Anda ~/.bashrcatau ~/.profileatau mirip berkas.
Yaron
sumber
4

Untuk menggunakan editor VI untuk mengedit crontab, gunakan perintah di bawah ini.

EDITOR="vi" crontab -e

atau, jika Anda ingin mengedit dengan editor lain seperti gedit, nano, dll., ganti saja vi dengan nama editor.

harsha
sumber
Terima kasih satu juta! Dengan EDITOR = "vi" crontab -e berfungsi.
justme
3
@gronostaj Ini tidak sama dengan jawaban lain yang telah diposting di sini. Mengatur variabel lingkungan untuk menjalankan tunggal perintah tunggal tidak sama dengan mengekspornya untuk semua perintah berikutnya dijalankan dari instance shell saat ini. Jawaban itu berguna untuk mengubah pengaturan secara permanen, tetapi untuk mengendalikan editor per-run, ini adalah jawaban yang benar.
Eliah Kagan
3
Memang, mengetahui bagaimana untuk menambahkan variabel lingkungan pada baris perintah sangat penting, karena mengubah variabel secara permanen mungkin tidak diinginkan. Salah satu kekuatan halus dari cangkang * nix adalah kemampuan untuk melakukan ini dengan mudah.
Monty Harder