ทำไม touch จึงสร้างไฟล์ใหม่


13

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

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

มันเป็นเพียงการตรวจสอบที่เขียนในรหัสของ touch หรือมันเป็นอย่างอื่นที่ทำให้ไฟล์ถูกสร้างขึ้น?


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

@Tim ไม่มีเหตุผลจริงที่คุณไม่สามารถใช้>/forcefsckหรือprintf '' >>/forcefsck(หลังจะเก็บเนื้อหาใด ๆ ที่มีอยู่) สิ่งที่คุณอธิบายเป็นวิธีการใช้ยูทิลิตี้ที่ทำงานในวิธีการบางอย่าง แต่นั่นไม่ได้มีเหตุผลว่าทำไมมันถูกเขียนขึ้นเพื่อใช้งาน
CVn

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

คำตอบ:


15

ใช้strace touch tผลผลิต:

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

มันมีอยู่ในtouchรหัส 's และฉันจะไม่เรียกว่าการตรวจสอบว่า เวลาประทับถูกอัพเดตโดยการเปิดไฟล์สำหรับการเขียนจากนั้นปิดไฟล์


14

touchสร้างไฟล์ใหม่ที่ว่างเปล่าหากไฟล์ไม่มีอยู่เพราะนั่นคือสิ่งที่มันถูกออกแบบมาให้ทำ ยูทิลิตี้จะต้องมีรหัสเพื่อจัดการกับกรณีนั้นโดยเฉพาะ ยูทิลิตี้ปรากฏในUnix V7 ; ของคู่มืออธิบายดังนี้:

touch - วันที่อัปเดตแก้ไขไฟล์ครั้งล่าสุด

touchความพยายามที่จะกำหนดวันที่แก้ไขของแต่ละไฟล์ สิ่งนี้ทำได้โดยการอ่านตัวอักษรจากไฟล์และเขียนกลับมา หากไม่มีไฟล์ ** อยู่จะมีการพยายามสร้างไฟล์ขึ้นมาเว้นแต่-cจะระบุตัวเลือกไว้

(ฉันไม่ทราบว่าเกิดอะไรขึ้นtouchถ้าไฟล์ว่างเปล่าการเรียกระบบพื้นฐานมาในภายหลัง)

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

นั่นคือสมมติว่าคุณมีไฟล์fooและ Makefile ที่ประกาศคำสั่งเพื่อสร้างเป็นจากbar fooเมื่อคุณพิมพ์make barคำสั่งจะถูกดำเนินการและbarถูกสร้างขึ้น ถ้าbarมีอยู่และเป็นรุ่นใหม่กว่าfoo, make barไม่ทำอะไรเลยเพราะmakeสันนิษฐานว่าbarได้รับการสร้างขึ้น อย่างไรก็ตามหากbarมีอายุมากกว่าfooให้คิดว่าbarไม่ทันสมัยและจำเป็นต้องสร้างใหม่

แต่ถ้ากฎการสร้างbarมีการเปลี่ยนแปลง? จากนั้นคุณมีสองตัวเลือก:

  • rm bar; make bar
  • touch foo; make bar

คุณจะต้องfooมีอยู่เพื่อสร้างbarมิฉะนั้นคำสั่งจะไม่ทำงาน

คำศัพท์“ สัมผัส” มีอยู่ในmakeยูทิลิตี้ด้วย: make -t barจะแกล้งทำเป็นเรียกใช้คำสั่งนั่นคือมันจะตั้งค่าเวลาการแก้ไขของbarเวลาปัจจุบันโดยไม่ต้องเรียกใช้คำสั่งเพื่อสร้างbar( จริง ๆถ้าคุณคิดว่า การเปลี่ยนแปลงที่fooไม่ควรมีผลกระทบbar) touchยูทิลิตี้จึงเป็นแบบสแตนด์อโลนของmake -tคุณลักษณะ

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