ใช้การสัมผัสและ vi?


55

มีประโยชน์ในการสร้างไฟล์ด้วยการสัมผัสก่อนที่จะแก้ไข .. เช่น:

touch foo
vi foo

เมื่อเทียบกับการได้รับมันเพื่อแก้ไขทันที? ชอบ:

vi foo

ฉันเห็นบทเรียนบางอย่างที่ใช้ในอดีต ( touchแล้วvi)

คำตอบ:


111

touchก่อนอื่นยืนยันว่าคุณมีความสามารถในการสร้างไฟล์แทนที่จะเสียเวลาในการแก้ไขเท่านั้นเพื่อค้นหาว่าระบบไฟล์นั้นเป็นแบบอ่านอย่างเดียวหรือมีปัญหาอื่น ๆ


6
และtouchให้คุณทำchmod +xหลังจากนั้นก่อนทำการแก้ไขซึ่งจะสมเหตุสมผลถ้าคุณเขียน#!/bin/bashเชลล์สคริปต์
Aaron McDaid

11
หรือคุณสามารถทำ:wสิ่งแรกหลังจากเริ่มviคิด (และ:chmod +x %ถ้าคุณต้องการทำให้มันใช้งานได้)
Stéphane Chazelas

26
touchอาจล้มเหลวที่vi's :w!จะได้ประสบความสำเร็จแม้ว่า (เช่นถ้าfileมีอยู่ แต่คุณไม่ได้เป็นเจ้าของและไม่ได้มีการเขียนการเข้าถึงมันในขณะที่คุณมีสิทธิ์ในการเขียนไปยังไดเรกทอรีปัจจุบัน) ตรงกันข้ามtouchอาจจะประสบความสำเร็จ แต่vi's :wหรือ:w!อาจล้มเหลวหากคุณเป็นเจ้าของไฟล์ แต่ไม่ได้มีการเขียนการเข้าถึงก็มิได้ไปยังไดเรกทอรีปัจจุบัน (คุณจะสามารถหลีกเลี่ยงมันด้วย:!chmod +w %(บางคนviการใช้งานเช่นvimสามารถทำ โดยอัตโนมัติเมื่อ:w!))
Stéphane Chazelas

ทำให้รู้สึกมากตอนนี้!
Fawix

4
เป็นกลุ่ม / VI "foo" [readonly]ระบุอย่างชัดเจนถ้าคุณเปิดแฟ้มที่คุณไม่ได้รับอนุญาตให้เขียนไปยัง: และอีกครั้งเมื่อเข้าสู่โหมดแทรก:Warning: Changing a readonly file.
DevSolar

25

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

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

สิ่งนี้จะเตือนพวกเขาแม้ว่าคุณจะไม่ได้ทำการเปลี่ยนแปลงใด ๆ ต่อ se และเพียงแค่สัมผัสไฟล์


จุดที่ดีดังนั้นจึงเป็นวิธีที่ดีในการค้นพบว่าผู้คนกำลังใช้ / แก้ไขไฟล์เดียวกันและเตือนพวกเขาในเวลาเดียวกัน ฉันเห็นประโยชน์ที่ชัดเจนของสิ่งนั้นในสภาพแวดล้อมหลายผู้เช่า!
Fawix

@Fawix คุณควรอัปเดตคำตอบนี้
Aswell

19

นอกเหนือจากคำตอบที่ยอมรับ:

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

viในทางกลับกันไม่ได้สร้างไฟล์ใหม่ยกเว้นว่าคุณเขียนลงไป

ตัวอย่างเช่นถ้าฉันพิมพ์vi test.txtให้พิมพ์บันทึกบางส่วนแล้วพิมพ์:q!; test.txtจะไม่อยู่


ประโยชน์ที่ได้อธิบายไว้ในคำตอบที่ยอมรับนั้นเป็นอย่างไร
JBentley

8

หากไม่มีtouchไฟล์ใหม่จะไม่มีอยู่จนกว่าคุณviจะบอกให้เขียน

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


4

ไม่มีประโยชน์ที่จะรับtouchก่อน; viจะสร้างไฟล์หากไม่มีอยู่

คำตอบที่ยอมรับบอกว่ามันตรวจสอบว่าคุณสามารถเขียนที่นั่นก่อนที่จะเสียเวลาในการแก้ไข จริง แต่ตอนนี้คุณจะเสียเวลาพิมพ์touchทุกครั้ง การไม่สามารถเขียนที่ไหนสักแห่งนั้นค่อนข้างพิเศษเมื่อเทียบกับความถี่ที่มันใช้งานได้ (ตราบใดที่คุณจำsudoไฟล์ที่อยู่นอกโฮมไดเร็กตอรี่ของคุณหรือ/tmpหรือเข้าสู่ระบบในฐานะรูท)

เพียงเปิดตัวแก้ไขและทำสิ่งที่คุณต้องการจากนั้นลองบันทึกไฟล์ หากยังใช้งานไม่ได้:w!ให้บันทึกไว้ที่อื่น ( :w ~/asdf) และแก้ไขปัญหา cat ~/asdf > /mnt/example.txt && rm ~/asdfเมื่อมีการแก้ไขคุณสามารถคัดลอกเนื้อหาไฟล์จากแฟ้มชั่วคราวไปที่เดิม: เหตุผลที่เราใช้catแทนmvหรือcpเพื่อใช้การอนุญาตของปลายทางและคุณสมบัติอื่น ๆ

นอกจากนี้สำหรับการใช้งานบรรทัดคำสั่งขั้นสูงบางอย่างที่คุณอาจพื้นหลังviด้วยCtrl+ Zในขณะที่คุณแก้ไขปัญหา (หรือใช้:suspendหรือ:sus) และสุดท้ายfgอีกครั้งเพื่อเรียกใช้คำสั่งในการเขียน

แก้ไข: โพสต์ได้รับการปรับปรุงเพื่อตอบสนองต่อความคิดเห็นของ/ u / G-Man ขอบคุณ!


3
มีปัญหาด้านความปลอดภัยที่นี่: (1) หากไฟล์/mnt/example.txtไม่ควรอ่านได้ทั่วโลก แต่ umask ของคุณถูกกำหนดเป็นบางอย่างที่อนุญาตเช่น 22 แล้ว/tmp/asdf จะสามารถอ่านได้ทั่วโลก หากมีคนอื่นในระบบพวกเขาอาจจะสามารถอ่านสำเนาชั่วคราวของไฟล์ (2) ไฟล์/mnt/example.txtนี้อาจไม่สามารถเขียนได้ทั่วโลก แต่ถ้ามีคนที่เป็นอันตรายในระบบพวกเขาอาจจะสามารถอ่านสำเนาชั่วคราวของไฟล์และแทนที่ด้วยเวอร์ชันที่แก้ไขก่อนที่คุณจะย้าย / คัดลอก มันกลับไปยังตำแหน่งที่ถูกต้อง   … (ต่อ)
G-Man

3
(ต่อ) ... (การตั้งค่าบิตเหนียวบน/tmpอาจป้องกันนี้.) (3) คำสั่งmv /tmp/asdf /mnt/example.txtทั้งหมดจะทำลายปัจจุบันและแทนที่ด้วย/mnt/example.txt /tmp/asdfคุณต้องการที่จะเปลี่ยนเนื้อหาของ/mnt/example.txtกับเนื้อหา/tmp/asdfของ โดยการใช้mvงานคุณได้ตั้งค่า/mnt/example.txtให้มีคุณสมบัติเหมือนกับ/tmp/asdf- อาจเป็นของคุณและเป็นที่อ่านได้ทั่วโลก มันอาจจะดีกว่าcp /tmp/asdf /mnt/example.txtหรือcat /tmp/asdf > /mnt/example.txtมากกว่า … PS (4) คุณสามารถระงับได้viโดยพิมพ์:suspend(หรือ:susสั้น ๆ )
G-Man

@ G-Man นั่นเป็นจุดที่ดี ฉันไม่กลัวที่จะขโมยไฟล์ในช่วง 5 นาที/tmpแต่ก็ไม่มีข้อแก้ตัวใด ๆ ที่จะไม่เขียน~/แทน ฉันยังไม่ได้คิดว่ามันจะเข้ามาแทนที่คุณลักษณะ ฉันจะแก้ไขโพสต์ของฉันขอบคุณ :)
ลัค


1

vi เป็นโปรแกรมแก้ไขข้อความที่มองเห็น (vi = visual) เป็นภาพที่เปรียบเทียบกับ "ed" ต่อไปซึ่งจะช่วยให้คุณเห็นและเปลี่ยนข้อความทีละบรรทัด

touchคำสั่งปรับปรุงการประทับเวลาในแฟ้มที่มีอยู่หรือสร้างไฟล์ใหม่ถ้าไฟล์ไม่ได้อยู่แล้ว มันดีสำหรับการทดสอบสิ่งต่าง ๆ ที่ขึ้นอยู่กับการประทับเวลาสูง

ตอนนี้หากไฟล์ของคุณเป็นไฟล์ข้อความหรือยังไม่มีอยู่ให้เปิดด้วย vi แล้วออกคำสั่ง:wqไปที่ vi จะมีผลเหมือนกับการแตะไฟล์นั้น นั่นเป็นวิธีเดียวที่คำสั่งทั้งสองจะคล้ายกันเลย


1

เฉพาะสำหรับใช้กับvi,มีความจำเป็นในการสร้างไฟล์ก่อนที่คุณแก้ไขมันviสามารถใช้ในการสร้างและบันทึกไฟล์ใหม่ อย่างไรก็ตามมีการเรียกบริบทที่ไฟล์จำเป็นต้องมีอยู่ ตัวอย่างเช่นในระบบของฉัน (OS X) ฉันสามารถเปิดตัวแก้ไข GUI ที่เหมาะสม (พิจารณาจากประเภทไฟล์) ดังนี้:

open foo.txt

สิ่งนี้จะเปิดfoo.txtใน TextEdit หรือใน emacs หรืออะไรก็ตามที่ฉันระบุว่าเป็นตัวเลือกแก้ไขสำหรับไฟล์ข้อความและแยกกระบวนการเพื่อให้ฉันได้รับพรอมต์ทันที ( open bar.pyอาจเปิดใน IDLE ตัวแก้ไข python ฯลฯ ) หรือฉันสามารถขอ emacs อย่างชัดเจน:

open -a emacs foo.txt

แต่openต้องการไฟล์ที่มีอยู่แล้วมิฉะนั้นจะเกิดข้อผิดพลาด ดังนั้นฉันต้องนิยามemacsว่าเป็นฟังก์ชั่นเชลล์ต่อไปนี้ซึ่งทำให้ฉันสามารถเขียนemacs fooเพื่อเปิดใช้งานemacsGUI ได้แม้ว่าfooจะไม่มีอยู่จริง

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}

0

vi ใช้เพื่อแก้ไขไฟล์ในฐานะผู้ใช้ในขณะที่ touch สามารถตั้งค่าการประทับเวลาในไฟล์และส่วนใหญ่จะใช้ในสคริปต์และเช่น

อีกวิธีในการสร้างไฟล์คือ:

>newfile.txt

1
สิ่งนี้ไม่น่าเชื่อถือเพราะไม่ได้ระบุ (afaik) ในข้อมูลจำเพาะ POSIX ตัวอย่างเช่นในzshมันเหมือนกันcat >newfile.txtและต้องการให้คุณกด Ctrl + D
Adam Katz

@ AdamKatz จุดดี; ฉันอัพเดตคำตอบแล้วขอบคุณสำหรับคำแนะนำ
James Youngman

0

งานหลักของเขาคือการเปลี่ยนการประทับเวลาของไฟล์
Ofc ยังสร้างไฟล์ด้วย timestamp ปัจจุบันแล้วคุณสามารถแก้ไขไฟล์ได้

VI เป็นตัวแก้ไขข้อความที่ทำในสิ่งที่มันบอกว่าแก้ไขข้อความที่เปิด, บันทึก, แก้ไขไฟล์ ฯลฯ

ทั้งหมดคือรสชาติของผู้ใช้และ habbit: สัมผัสแล้ว vi หรือ vi file.txt สิ่งเดียวกันสีที่แตกต่างกัน


0

touch คำสั่งเปลี่ยนวันที่และเวลาของไฟล์ที่มีการประทับเวลาปัจจุบัน
หากไฟล์ไม่มีอยู่ไฟล์จะสร้างไฟล์ใหม่พร้อมวันที่และเวลา

vi editorใช้เพื่อแก้ไขไฟล์หากไม่มีไฟล์มันจะสร้างไฟล์ใหม่เว้นแต่ว่าเราจะไม่บันทึกไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.