Trình chỉnh sửa này được mở bởi crontab là gì?


41

Tôi muốn chỉnh sửa crontab. Nó được cho là Vi, nhưng không phải, như bạn có thể thấy:

root@euve252628:~# crontab -e

0

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

?

:wq

?

Có, nó đã cho tôi một ?. Và tại sao nó cho tôi một con số không?

Khi tôi gõ a qvà nhấn Enter- nó thoát. Tôi cần biết cách tiết kiệm, vì đó không phải là Vi cổ điển.


5
Rất có thể ed: theo mặc định, nó đưa ra số lượng ký tự (mà trong các hệ thống dựa trên Debian thường 888là lần đầu tiên, là số lượng ký tự trong mẫu "crontab" trống). Nếu bạn đang thấy số 0, bạn phải sửa nó. Xem lệnh Crontab -e không hoạt động chính xác
Steeldo

31
Ed, anh bạn! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist

6
@juhist Thay vì một lời nhận xét này nên các câu trả lời.
tráng miệng

1
Mặc dù bạn thường chỉ muốn ghi đè lên EDITORmột cái gì đó khác, nhưng nếu bạn quan tâm đến việc thực sự sử dụng ed, thì đây là một lời giới thiệu tuyệt vời: ordtum.geek.nz/arabesque/actingly-USE-ed
Xiong Chiamiov

@justme, nhân tiện, chào mừng bạn đến với StackExchange! Nếu bạn tìm thấy câu trả lời phù hợp nhất với câu hỏi của mình, bạn có thể chấp nhận nó bằng cách nhấp vào dấu chọn bên cạnh nó.
JoL

Câu trả lời:


65

Đó là ed

Theo mặc định, dấu nhắc của nó là chuỗi rỗng. Nếu bạn muốn bỏ, chỉ cần nhập q. Không tiền tố với :. Nếu bạn có những thay đổi chưa được lưu, nó sẽ trả lời ?. Bạn có thể hiểu là "bạn có chắc không?" Và xác nhận lại bằng cách ra lệnh q. Bằng cách này, bất kỳ lệnh nào nó không hiểu cũng sẽ khiến nó trả lời ?. Đó là thông báo lỗi duy nhất mà nó biết.

Lệnh của nó là gì vim / vi / cũ / sed được dựa trên, vì vậy các lệnh thích g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqcông việc giống như vim.

Các lệnh như i, acđi vào chế độ chèn. Để thoát khỏi chế độ chèn và quay lại chế độ lệnh, chỉ cần nhập một dòng chỉ có a .. Để "di chuyển" sang dòng khác, chỉ cần nhập số dòng, phần bù từ dòng hiện tại như +2hoặc -1hoặc biểu thức chính quy như một lệnh để đi đến dòng đó. .có nghĩa là dòng hiện tại trong chế độ lệnh. Bạn có thể sử dụng nó để biết bạn đang ở đâu. $có nghĩa là dòng cuối cùng.

Nhân tiện, nếu bạn muốn tìm hiểu thêm về nó, đây là một chương trình GNU trong linux, hầu hết các tài liệu của nó đều ở info edthay vì man ed.

Đây là một phiên ví dụ, với các ý kiến ​​được thêm vào (không được chấp nhận bởi 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: Giống như đề cập đến grawity, các thông báo lỗi hữu ích hơn có thể được kích hoạt bằng hhoặc H. Ngoài ra, ,thay vì %trong phần phạm vi của lệnh là cách chính thức để chỉ "tất cả các dòng" trong ed. Trong GNU ed, khả năng sử dụng %cho việc này được hỗ trợ nhưng không được đề cập trong infohướng dẫn. Sử dụng %cho tất cả các dòng rõ ràng được phát minh bởi ex, dường như bởi vì, ở đó, ,có nghĩa .,.là hơn là 1,$thích ed.

EDIT2: Đặt trình chỉnh sửa khác

Giống như các câu trả lời khác được đề cập, nếu bạn muốn chỉ định một trình soạn thảo khác, bạn có thể làm như vậy bằng cách đặt các biến EDITORhoặc VISUALmôi trường. Sự khác biệt giữa hai được giải thích trong câu trả lời này .

Bạn có thể làm như vậy nếu bạn muốn đặt nó cho một lệnh duy nhất:

EDITOR=vi crontab -e

hoặc như thế này nếu bạn muốn tất cả các chương trình được khởi chạy trong phiên shell sử dụng nó:

export EDITOR=vi
crontab -e

Bạn có thể lưu exportvào ~/.profilehoặc /etc/profile, tùy theo bạn muốn nó là cài đặt người dùng hoặc hệ thống cho bash, tương ứng. Đó là cách di động unix để thiết lập trình chỉnh sửa; bạn có thể làm điều này trong bất kỳ phân phối.

Trong Ubuntu, cũng có update-alternativeslệnh. Trình chỉnh sửa mặc định hiện tại có thể được nhìn thấy update-alternatives --display editorvà bạn có thể sử dụng update-alternatives --config editorđể đặt nó:

$ 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
Các phiên bản hiện đại biết thông báo lỗi tiếng Anh, bạn chỉ cần sử dụng hđể yêu cầu chúng (hoặc Hđể bật vĩnh viễn).
grawity

2
(Ngoài ra, %dường như là một phát minh . Chính thức ed sử dụng ,có nghĩa là tất cả các dòng, mặc dù một số phiên bản cũng chấp nhận %.)
grawity

Điều này là chính xác nhưng cũng nên đề cập đến các biến EDITORVISUALmôi trường.
chrylis -on đình công-

Hầu hết các lệnh trong edđều giống như trong vi, ngoại trừ bạn không phải nhấn ":" trước tiên để thoát khỏi chế độ chỉnh sửa đồ họa. Tôi đã học được Unix khi "lập trình viên thực sự" không lãng phí thời gian sử dụng GUI - thiết bị đầu cuối "màn hình xanh" 80x25 hoạt động gần như một cú đấm thẻ IBM 029 để chỉnh sửa, nhưng không hoàn toàn;)
alephzero

@chrylis EDITORVISUALkhông thực sự có liên quan. Câu hỏi cơ bản là: trình soạn thảo này là gì và làm cách nào để sử dụng nó? (đây là những gì 0và điều này ?, và làm thế nào để tiết kiệm?).
JoL

39

Làm thế nào để tìm ra trình soạn thảo này là gì

Nhấn Ctrl+ Z. Điều này đình chỉ trình soạn thảo và cung cấp cho bạn một dấu nhắc shell. Tại dấu nhắc, hãy chạy psđể xem những tiến trình nào đang chạy trong thiết bị đầu cuối này.

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

bashlà shell ban đầu, crontabđược mong đợi, shlà một shell khác phải được gọi bởi crontabpspslệnh đang chạy . Lá đó ed(được cung cấp bởi gói cùng tên ).

Nếu bạn không thể tìm ra cách thoát khỏi trình soạn thảo, bạn có thể tắt nó vào thời điểm này, bằng kill 26302hoặc kill %1.

Ed là gì?

Ed là một biên tập viên cổ xưa, có từ trước khi màn hình là một thứ (phổ biến). Nó được thiết kế cho các máy tính có thiết bị ngoại vi đầu ra tương tác là một thiết bị điều khiển từ xa .

Các 0nó hiển thị ngay từ đầu là số dòng trong tập tin. Rõ ràng đó là thông tin quan trọng.

?có nghĩa là ed không hiểu những gì bạn gõ. Máy in dòng chậm, vì vậy ed không lãng phí thời gian và mực để hiển thị thông tin vô nghĩa như thông báo lỗi. Một trò đùa cũ (tôi không biết nguồn gốc) đi:

Ken Thompson có một chiếc ô tô mà anh ấy đã giúp thiết kế. Không giống như hầu hết các xe ô tô, nó không có đồng hồ tốc độ, cũng không có ga, cũng không có bất kỳ đèn nào trong số nhiều đèn ngu ngốc khác gây khó chịu cho người lái xe hiện đại. Thay vào đó, nếu người lái mắc lỗi, một chiếc máy bay khổng lồ, đèn led sáng ở giữa bảng điều khiển. Người lái xe có kinh nghiệm, người nói, người nói, Thompson thường sẽ biết điều gì sai.

Nếu bạn cảm thấy thiếu kinh nghiệm, bạn có thể ra lệnh H(tất cả các lệnh nhưng một là một chữ cái (không tính đối số dữ liệu), vì ai thích gõ) và bạn sẽ nhận được thông báo lỗi. Ví dụ, nếu bạn chỉ cần nhấn Enter...

?
H
Invalid address

Rõ ràng, phải không? (Một dòng trống là lệnh trống - một dòng không phải là một chữ cái. Lệnh trống sẽ di chuyển đến dòng tiếp theo và in nó. Nếu bạn ở cuối tệp, luôn luôn là một trường hợp trống tệp, không có dòng tiếp theo, vì vậy địa chỉ mà bạn yêu cầu di chuyển là không hợp lệ.)

Làm thế nào để có được một biên tập viên khác

Các crontablệnh, giống như hầu hết các lệnh chạy một trình soạn thảo văn bản, kiểm tra các biến môi trường VISUALEDITOR(theo thứ tự đó) để quyết định chương trình để chạy, té ngửa ra một mặc định của hệ thống. Nếu một trong hai biến này được đặt thành ed, hãy thay đổi hoặc xóa nó.

Trên Ubuntu (và Debian và những người khác), trình chỉnh sửa mặc định của hệ thống /etc/alternatives/editor, được quản lý thông qua cơ chế thay thế . Theo mặc định, nó chọn trình soạn thảo tốt nhất trong số các ứng dụng được cài đặt, trong đó, bộ phận tốt nhất được xác định bởi các ưu tiên được đặt bởi các nhà bảo trì gói. Sử dụng update-alternativesđể cấu hình một sự thay thế. Bạn có thể hiển thị các trình soạn thảo có sẵn và các ưu tiên của họ với

update-alternatives --display editor

edcó mức độ ưu tiên -100, trong khi tất cả các trình soạn thảo có thể cảm nhận được các bộ phận khác có mức độ ưu tiên tích cực, vì vậy cách duy nhất nó sẽ được sử dụng theo mặc định là nếu không có trình soạn thảo nào được cài đặt. Cài đặt mặc định của Ubuntu sử dụng nano làm trình chỉnh sửa mặc định, với mức độ ưu tiên 400. Nếu thay thế đã được đặt thành ed, bạn có thể thay đổi nó bằng

sudo update-alternatives --config editor

Gilles, không nên trên Ubuntu (và Debian và những người khác), trình chỉnh sửa mặc định của hệ thống là / etc / thay thế / trình chỉnh sửa được chuyển sang On Ubuntu (và Debian và các trình khác), trình chỉnh sửa mặc định của hệ thống là / usr / bin / trình chỉnh sửa ?
heemayl

khá toàn diện (ngoại trừ nó không đề cập đến biến env EDITOR? nhưng có thể về mục đích, để mọi người sử dụng cách thích hợp để đặt nó trên hệ thống thông qua các lựa chọn thay thế cập nhật). Có thể thay đổi tuy nhiên: psvới pstree -sap $$ ? (dễ dàng hơn để tìm ra trình soạn thảo nào đã được khởi chạy, vì bây giờ nó ở dạng cây)
Olivier Dulac

@heemayl /usr/bin/editorlà một liên kết tượng trưng đến /etc/alternatives/editor. Thực tế là các ứng dụng gọi /usr/bin/editorlà một chi tiết mà tôi đã bỏ qua.
Gilles 'SO- ngừng trở nên xấu xa'

3
@OlivierDulac Tôi có đề cập đến EDITORVISUAL. Thực tế chúng là cách thích hợp để chọn một trình soạn thảo vì đây là tùy chọn của người dùng, không phải là tùy chọn toàn hệ thống. Tôi thích gắn bó psở đây để giữ cho mọi thứ đơn giản.
Gilles 'SO- ngừng trở nên xấu xa'

1
"... máy tính có thiết bị ngoại vi đầu ra tương tác là máy in dòng." Một máy in dòng không phải là một thiết bị tương tác - nó là một thiết bị tốc độ tương đối cao (và đắt tiền) để tạo ra số lượng lớn đầu ra được in. Bạn có nghĩa là "một thiết bị đầu cuối in bằng bàn phím", giống như một máy teletype (cũng có thể hoạt động như một thiết bị I / O băng giấy đục lỗ) hoặc một máy đánh chữ "golfball" của IBM.
alephzero

12

Từ câu hỏi của bạn, có vẻ như EDITOR mặc định của bạn không có vim, và bạn gặp vấn đề với trình chỉnh sửa mặc định hiện tại.

Lệnh dưới đây sẽ đặt EDITOR mặc định thành vim

export EDITOR=vim

Sau khi đặt trình chỉnh sửa mặc định thành vim, chạy crontab -esẽ sử dụng vimlàm trình chỉnh sửa của bạn.

Ghi chú:

  1. Nếu bạn thích, bạn có thể chọn EDITOR khác làm trình chỉnh sửa mặc định của mình
  2. Nếu bạn muốn thiết lập các biên tập viên mặc định để vimvĩnh viễn, bạn sẽ có thêm lệnh trên để bạn ~/.bashrchoặc ~/.profiletập tin hoặc tương đương.

4

Để sử dụng trình soạn thảo VI để chỉnh sửa crontab, hãy sử dụng lệnh bên dưới.

EDITOR="vi" crontab -e

hoặc, nếu bạn muốn chỉnh sửa bằng một trình soạn thảo khác như gedit, nano, v.v., chỉ cần thay thế vi bằng tên trình soạn thảo.


Thanx một triệu! Với EDITOR = "vi" crontab -e nó hoạt động.
justme

3
@gronostaj Điều này không giống với bất kỳ câu trả lời nào khác đã được đăng ở đây. Đặt một biến môi trường cho một lần chạy của một lệnh không giống như xuất nó cho tất cả các lệnh tiếp theo chạy từ thể hiện shell hiện tại. Câu trả lời đó hữu ích cho việc thay đổi cài đặt vĩnh viễn, nhưng để kiểm soát trình chỉnh sửa mỗi lần chạy, đây là câu trả lời đúng.
Eliah Kagan

3
Thật vậy, biết cách bổ sung các biến môi trường trên dòng lệnh là rất quan trọng, vì việc thay đổi biến vĩnh viễn có thể là điều không mong muốn. Một trong những điểm mạnh tinh tế của đạn * nix là khả năng thực hiện việc này rất dễ dàng.
Monty Harder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.