ตัวแก้ไขนี้ที่เปิดโดย crontab คืออะไร


41

ฉันต้องการแก้ไข crontab มันควรจะเป็น Vi แต่ไม่ใช่ตามที่คุณเห็น:

root@euve252628:~# crontab -e

0

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

?

:wq

?

?ใช่มันให้ฉัน แล้วทำไมมันถึงทำให้ฉันมีค่าเป็นศูนย์?

เมื่อฉันพิมพ์qและกดEnter- มันออกจาก ฉันจำเป็นต้องรู้วิธีการบันทึกเพราะมันไม่ได้เป็นคลาสสิก Vi


5
เป็นไปได้มากที่สุดed: โดยค่าเริ่มต้นมันจะนับจำนวนตัวอักษร (ซึ่งโดยปกติแล้ว888ในระบบที่ใช้เดเบียนจะเป็นครั้งแรกที่มีจำนวนอักขระในเทมเพลต "ว่าง" crontab) หากคุณเห็นจำนวน 0 คุณต้องแก้ไขสิ่งนั้น ดูคำสั่ง Crontab -e ทำงานไม่ถูกต้อง
steeldriver

31
เอ็ดคน! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist

6
@juhist แทนที่จะความคิดเห็นนี้ควรจะคำตอบ
ของหวาน

1
ในขณะที่คุณมักจะต้องการเพียงแค่การแทนที่EDITORอย่างอื่นถ้าคุณกำลังสนใจในการใช้จริงเอ็ดนี้เป็นแนะนำที่ดี: sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov

@ justme โดยวิธียินดีต้อนรับสู่ StackExchange! หากคุณพบคำตอบที่ดีที่สุดตอบคำถามของคุณคุณสามารถยอมรับได้โดยคลิกที่เครื่องหมายถูกที่อยู่ติดกัน
JoL

คำตอบ:


65

ที่ ed

โดยค่าเริ่มต้นมันเป็นสตริงที่ว่างเปล่า qหากคุณต้องการที่จะเลิกเพียงแค่ใส่ :อย่าคำนำหน้าด้วย ?หากคุณมีการเปลี่ยนแปลงที่ไม่ได้บันทึกไว้ก็จะตอบกลับด้วย คุณสามารถตีความว่าเป็น "คุณแน่ใจหรือไม่" และยืนยันโดยคำสั่งqอีกครั้ง คำสั่งใด ๆ ที่ไม่เข้าใจจะทำให้ตอบกลับ?ได้ นั่นเป็นข้อผิดพลาดเดียวที่รู้

คำสั่งของมันเป็นสิ่งที่เป็นกลุ่ม / VI / อดีต / sed อยู่บนพื้นฐานเพื่อให้คำสั่งที่ชอบg/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqการทำงานเช่นเดียวกับที่เป็นกลุ่ม

คำสั่งที่ชอบi, aและcเข้าสู่โหมดแทรก .ที่จะออกจากโหมดการแทรกและกลับไปที่โหมดคำสั่งเพียงแค่ใส่เส้นที่มีเพียงหนึ่ง หากต้องการ "ย้าย" ไปยังบรรทัดอื่นเพียงป้อนหมายเลขบรรทัดออฟเซ็ตจากบรรทัดปัจจุบันเช่น+2หรือ-1หรือ regex เป็นคำสั่งเพื่อไปที่บรรทัดนั้น .หมายถึงบรรทัดปัจจุบันในโหมดคำสั่ง คุณสามารถใช้มันเพื่อรู้ว่าคุณอยู่ที่ไหน $หมายถึงบรรทัดสุดท้าย

โดยวิธีการที่ถ้าคุณต้องการที่จะเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้เป็นโปรแกรม GNU ในลินุกซ์ส่วนใหญ่ของเอกสารที่อยู่ในแทนinfo edman ed

นี่คือตัวอย่างเซสชันที่มีการเพิ่มความคิดเห็น (ไม่ได้รับการยอมรับจาก 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

แก้ไข: ชอบ grawity กล่าวถึงข้อผิดพลาดที่เป็นประโยชน์มากขึ้นสามารถเปิดใช้งานด้วยหรือh Hนอกจากนี้,มากกว่า%ในส่วนช่วงของคำสั่งเป็นวิธีอย่างเป็นทางการในการอ้างถึง "ทุกบรรทัด" edใน ใน GNU edความเป็นไปได้ที่จะใช้%สำหรับสิ่งนี้ได้รับการสนับสนุน แต่ไม่ได้กล่าวถึงในinfoคู่มือ ใช้%สำหรับสายทั้งหมดเห็นได้ชัดว่าถูกคิดค้นโดยexดูเหมือนเพราะนั่น,หมายถึง.,.มากกว่าเหมือนใน1,$ed

EDIT2: การตั้งค่าตัวแก้ไขอื่น

เช่นเดียวกับคำตอบอื่น ๆ ที่กล่าวถึงหากคุณต้องการระบุโปรแกรมแก้ไขอื่นคุณสามารถทำได้โดยการตั้งค่าEDITORหรือVISUALตัวแปรสภาพแวดล้อม ความแตกต่างระหว่างทั้งสองอธิบายในคำตอบนี้

คุณสามารถทำเช่นนี้หากคุณต้องการตั้งค่าสำหรับคำสั่งเดียว:

EDITOR=vi crontab -e

หรือเช่นนี้หากคุณต้องการให้โปรแกรมทั้งหมดเปิดใช้งานในเซสชันเชลล์เพื่อใช้งาน:

export EDITOR=vi
crontab -e

คุณสามารถบันทึกexportใน~/.profileหรือ/etc/profileขึ้นอยู่กับว่าคุณต้องการให้ผู้ใช้หรือการตั้งค่าระบบสำหรับทุบตีตามลำดับ นั่นเป็นวิธีพกพา unix ในการตั้งค่าเครื่องมือแก้ไข คุณสามารถทำสิ่งนี้ในการกระจายใด ๆ

ใน Ubuntu ยังมีupdate-alternativesคำสั่งด้วย สามารถดูเอดิเตอร์เริ่มต้นปัจจุบันด้วยupdate-alternatives --display editorและคุณสามารถใช้update-alternatives --config editorเพื่อตั้งค่า:

$ 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
รุ่นทันสมัยรู้ข้อความแสดงข้อผิดพลาดภาษาอังกฤษคุณเพียงแค่ต้องใช้hเพื่อขอให้พวกเขา (หรือHเปิดใช้งานอย่างถาวร)
grawity

2
( %ดูเหมือนจะเป็นสิ่งประดิษฐ์อดีตedใช้อย่างเป็นทางการ,เพื่อหมายถึงทุกบรรทัดแม้ว่าบางรุ่นจะยอมรับ%เช่นกัน)
grawity

สิ่งนี้ถูกต้องแต่ควรพูดถึงEDITORและVISUALตัวแปรสภาพแวดล้อม
chrylis -on strike-

คำสั่งส่วนใหญ่edเหมือนกับในviยกเว้นคุณไม่จำเป็นต้องกด ":" ก่อนเพื่อออกจากโหมดแก้ไขกราฟิก ฉันได้เรียนรู้ Unix เมื่อ "โปรแกรมเมอร์จริง" ไม่ต้องเสียเวลากับการใช้ GUI - เทอร์มินัลหน้าจอสีเขียว 80x25 "ใช้งานได้เกือบเหมือนกับหมัดบัตร IBM 029 สำหรับการแก้ไข แต่ไม่มาก;)
alephzero

@chrylis EDITORและVISUALไม่เกี่ยวข้องกันจริงๆ คำถามคือโดยทั่วไปแล้วตัวแก้ไขนี้คืออะไรและฉันจะใช้ได้อย่างไร (นี่คืออะไร0และสิ่งนี้?และฉันจะบันทึกได้อย่างไร)
JoL

39

วิธีค้นหาว่าตัวแก้ไขนี้คืออะไร

กด+Ctrl Zสิ่งนี้จะระงับตัวแก้ไขและให้เชลล์พรอมต์แก่คุณ ที่พรอมต์ให้เรียกใช้psเพื่อดูว่ากระบวนการใดกำลังทำงานอยู่ในเทอร์มินัลนี้

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เป็นเชลล์ดั้งเดิมที่crontabคาดว่าshเป็นเชลล์อื่นที่ต้องถูกเรียกใช้โดยcrontabและpsเป็นpsคำสั่งที่รันอยู่ ใบนั้นed(จัดทำโดยแพ็คเกจที่มีชื่อเดียวกัน )

ถ้าคุณไม่สามารถคิดออกว่าจะลาออกจากการแก้ไขคุณสามารถฆ่ามันที่จุดนี้ด้วยหรือkill 26302kill %1

ed คืออะไร

เอ็ดเป็นบรรณาธิการโบราณย้อนหลังไปก่อนหน้าจอเป็นเรื่องธรรมดา มันถูกออกแบบมาสำหรับคอมพิวเตอร์ที่มีอุปกรณ์ต่อพ่วงเอาท์พุทแบบโต้ตอบเป็นโทรพิมพ์

0จะแสดงที่จุดเริ่มต้นเป็นจำนวนบรรทัดในไฟล์ เห็นได้ชัดว่าเป็นข้อมูลที่สำคัญ

?หมายความว่าเอ็ดไม่เข้าใจสิ่งที่คุณพิมพ์ เครื่องพิมพ์รายบรรทัดช้าดังนั้น ed จึงไม่ต้องเสียเวลาและหมึกในการแสดงข้อมูลที่ไม่มีประโยชน์เช่นข้อความแสดงข้อผิดพลาด เรื่องตลกเก่า ๆ (ฉันไม่รู้ต้นกำเนิด) ไป:

Ken Thompson มีรถยนต์ที่เขาช่วยออกแบบ ต่างจากรถยนต์ส่วนใหญ่มันไม่มีมาตรวัดความเร็วหรือมาตรวัดก๊าซหรือไฟอื่น ๆ อีกมากมายที่ทำให้เกิดภัยพิบัติกับคนขับรถรุ่นใหม่ แต่หากผู้ขับขี่ทำผิดพลาดยักษ์“?” จะสว่างขึ้นตรงกลางแผงหน้าปัด “ ผู้ขับขี่ที่มีประสบการณ์” ธ อมป์สันกล่าว“ มักจะรู้ว่ามีอะไรผิดปกติ”

หากคุณรู้สึกไม่มีประสบการณ์คุณสามารถออกคำสั่งH(คำสั่งทั้งหมด แต่มีเพียงตัวอักษรตัวเดียว (ไม่นับการขัดแย้งข้อมูล) เพราะผู้ที่ชอบพิมพ์) และคุณจะได้รับข้อความแสดงข้อผิดพลาด ตัวอย่างเช่นหากคุณเพียงกดEnter...

?
H
Invalid address

ชัดเจนแล้วใช่ไหม (บรรทัดว่างคือคำสั่งที่ว่างเปล่า - คำสั่งที่ไม่ใช่อักษรตัวเดียวคำสั่งที่ว่างจะย้ายไปที่บรรทัดถัดไปและพิมพ์ออกมาหากคุณอยู่ที่ท้ายไฟล์ ไฟล์ไม่มีบรรทัดถัดไปดังนั้นที่อยู่ที่คุณขอให้ย้ายไม่ถูกต้อง)

วิธีรับตัวแก้ไขอื่น

crontabคำสั่งเช่นคำสั่งส่วนใหญ่ที่ทำงานแก้ไขข้อความให้ตรวจสอบตัวแปรสภาพแวดล้อมVISUALและEDITOR(ตามลำดับ) ที่จะตัดสินใจว่าโปรแกรมที่จะวิ่งกลับไปเริ่มต้นของระบบลดลง หากตัวแปรตัวใดตัวหนึ่งเหล่านี้ถูกตั้งค่าเป็นedเปลี่ยนหรือลบออก

บน Ubuntu (และ Debian และอื่น ๆ ), แก้ไขระบบเริ่มต้นเป็น/etc/alternatives/editorที่มีการจัดการผ่านกลไกทางเลือก โดยค่าเริ่มต้นมันเลือก "ดีที่สุด" แก้ไขที่ติดตั้งโดยที่ "ดีที่สุด" ถูกกำหนดโดยลำดับความสำคัญที่กำหนดโดยผู้ดูแลแพคเกจ ใช้update-alternativesเพื่อกำหนดค่าทางเลือก คุณสามารถแสดงบรรณาธิการที่มีอยู่และลำดับความสำคัญของพวกเขาด้วย

update-alternatives --display editor

edมีลำดับความสำคัญ -100 ในขณะที่บรรณาธิการ "ที่เหมาะสม" อื่น ๆ ทั้งหมดมีลำดับความสำคัญเป็นบวกดังนั้นวิธีเดียวที่จะใช้เป็นค่าเริ่มต้นคือหากไม่มีการติดตั้งโปรแกรมแก้ไขใด ๆ การติดตั้งเริ่มต้นของ Ubuntu ใช้นาโนเป็นตัวแก้ไขเริ่มต้นโดยมีลำดับความสำคัญ 400 หากตั้งค่าตัวเลือกอื่นเป็นedคุณสามารถเปลี่ยนได้ด้วย

sudo update-alternatives --config editor

Gilles ไม่ควรบน Ubuntu (และ Debian และอื่น ๆ ) ตัวแก้ไขค่าเริ่มต้นของระบบคือ / etc / ทางเลือก / ตัวแก้ไขจะถูก rephrased เป็นบน Ubuntu (และ Debian และอื่น ๆ ) ตัวแก้ไขค่าเริ่มต้นของระบบคือ / usr / bin / editor ?
heemayl

ค่อนข้างครอบคลุม (ยกเว้นว่ามันไม่ได้พูดถึงตัวแปร env ของ EDITOR แต่อาจมีวัตถุประสงค์เพื่อให้ผู้คนใช้วิธีที่เหมาะสมในการตั้งค่าบนระบบผ่านทางตัวเลือกการอัปเดต) อาจจะมีการเปลี่ยนแปลงอย่างไร: psด้วยpstree -sap $$ ? (ง่ายกว่าที่จะเข้าใจว่าตัวแก้ไขใดที่เปิดตัวเนื่องจากขณะนี้อยู่ในรูปแบบต้นไม้)
Olivier Dulac

@heemayl /usr/bin/editorเป็น symlink /etc/alternatives/editorไป ความจริงที่ว่าแอปพลิเคชันโทร/usr/bin/editorเป็นรายละเอียดที่ฉันข้ามไป
Gilles 'หยุดความชั่วร้าย'

3
@OlivierDulac ฉันจะพูดถึงและEDITOR VISUALอันที่จริงแล้วเป็นวิธีที่เหมาะสมในการเลือกเครื่องมือแก้ไขเนื่องจากนี่เป็นค่ากำหนดของผู้ใช้ไม่ใช่ค่ากำหนดทั่วทั้งระบบ ฉันชอบที่จะpsอยู่ที่นี่เพื่อให้สิ่งที่ง่าย
Gilles 'หยุดความชั่วร้าย'

1
"... คอมพิวเตอร์ที่มีอุปกรณ์ต่อพ่วงเอาต์พุตแบบโต้ตอบเป็นเครื่องพิมพ์บรรทัด" เครื่องพิมพ์แบบ Line ไม่ใช่อุปกรณ์แบบอินเทอร์แอคทีฟ - มันเป็นอุปกรณ์ความเร็วสูง (และแพง) สำหรับการผลิตงานพิมพ์จำนวนมาก คุณหมายถึง "เทอร์มินัลการพิมพ์ที่มีแป้นพิมพ์" เช่น teletype (ซึ่งอาจทำงานเป็นอุปกรณ์ I / O เทปกระดาษ punched) หรือเครื่องพิมพ์ดีด "golfball" ของ IBM
alephzero

12

จากคำถามของคุณดูเหมือนว่า EDITOR เริ่มต้นของคุณจะไม่vimและคุณมีปัญหากับตัวแก้ไขเริ่มต้นปัจจุบัน

คำสั่งด้านล่างจะตั้ง EDITOR เริ่มต้นให้เป็น vim

export EDITOR=vim

หลังจากตั้งค่าตัวแก้ไขเริ่มต้นที่จะvimทำงานแล้วcrontab -eจะใช้vimเป็นตัวแก้ไขของคุณ

หมายเหตุ:

  1. หากคุณต้องการคุณสามารถเลือก EDITOR อื่นเป็นตัวแก้ไขเริ่มต้นของคุณ
  2. หากคุณต้องการตั้งค่าเครื่องมือแก้ไขเริ่มต้นเป็นvimอย่างถาวรคุณจะต้องเพิ่มคำสั่งด้านบนลงในไฟล์ของคุณ~/.bashrcหรือ~/.profileไฟล์ที่คล้ายกัน

4

หากต้องการใช้เครื่องมือแก้ไข VI เพื่อแก้ไข crontab ให้ใช้คำสั่งด้านล่าง

EDITOR="vi" crontab -e

หรือหากคุณต้องการแก้ไขด้วยเครื่องมือแก้ไขอื่นเช่น gedit, nano เป็นต้นเพียงแค่แทนที่ vi ด้วยชื่อเครื่องมือแก้ไข


ขอบคุณมาก! ด้วย EDITOR = "vi" crontab -e มันใช้งานได้
justme

3
@gronostaj นี่ไม่เหมือนกับคำตอบอื่น ๆ ที่โพสต์ไว้ที่นี่ การตั้งค่าตัวแปรสภาพแวดล้อมสำหรับการรันครั้งเดียวของคำสั่งเดียวนั้นไม่เหมือนกับการส่งออกสำหรับคำสั่งที่ตามมาทั้งหมดที่เรียกใช้จากเชลล์อินสแตนซ์ปัจจุบัน คำตอบนั้นมีประโยชน์สำหรับการเปลี่ยนการตั้งค่าอย่างถาวร แต่สำหรับการควบคุมเอดิเตอร์ต่อการรันนี่เป็นคำตอบที่ถูกต้อง
Eliah Kagan

3
อันที่จริงการรู้วิธีเพิ่มตัวแปรสภาวะแวดล้อมบนบรรทัดรับคำสั่งมีความสำคัญมากเนื่องจากการเปลี่ยนแปลงตัวแปรอย่างถาวรอาจไม่เป็นที่ต้องการ จุดแข็งอย่างหนึ่งของเปลือกหอย * nix คือความสามารถในการทำเช่นนี้ได้อย่างง่ายดาย
Monty Harder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.