การใช้ตัวเลือก -f สำหรับ `touch 'คืออะไร?


23

จากman touch:

-f     (ignored)

แต่ฉันไม่ได้รับสิ่งที่หมายโดยไม่สนใจ

ฉันได้ลองทำดังนี้:

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file

-fและสังเกตเห็นว่ามันมีการเปลี่ยนแปลงการประทับเวลาทั้งๆที่

ดังนั้นฉันต้องการรู้ว่าสิ่งใด-fเป็นสิ่งที่ดี


2
ฉันคิดว่า-fเป็นตัวเลือกจะถูกละเว้น บางทีอาจมีการแยกวิเคราะห์ผ่านตัวแยกวิเคราะห์และนั่นคือมัน
โทมัส

1
(ละเว้น) หมายความว่าการตั้งค่าสถานะถูกละเว้นไม่ใช่คำสั่ง
คดีของกองทุนโมนิกา

คำตอบ:


47

สำหรับยูทิลิตี้ GNU เอกสารฉบับเต็มอยู่ในinfoหน้าซึ่งคุณสามารถอ่านได้:

-f
ละเว้น; สำหรับความเข้ากันได้กับ `touch 'รุ่น BSD

ดูหน้าประวัติศาสตร์ BSD สำหรับการสัมผัสซึ่ง-fจะบังคับให้มีการสัมผัส

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

เห็นได้ชัดว่าคุณต้องการสิทธิ์ในการอ่านและเขียน ( touchจะหลีกเลี่ยงการพยายามทำเช่นนั้นหากaccess(W_OK|R_OK)ส่งคืนเท็จ ) -fพยายามหลีกเลี่ยงสิ่งนั้นโดยเปลี่ยนการอนุญาตเป็นการชั่วคราวเป็น 0666 !

0666 หมายถึงสิทธิ์ในการอ่านและเขียนสำหรับทุกคน จะต้องเป็นเช่นนั้น (เช่นได้รับอนุญาตที่เข้มงวดมากขึ้นเช่น 0600 ที่ยังคงอนุญาตให้ใช้การสัมผัส ) ซึ่งอาจหมายถึงในช่วงเวลาสั้น ๆ นั้นกระบวนการที่จะอนุญาตให้อ่านหรือเขียนไฟล์ไม่สามารถทำได้อีกต่อไป ทำลายการทำงาน

นั่นหมายความว่าอย่างไรว่ากระบวนการที่จะไม่เป็นอย่างอื่นได้เข้าถึงไฟล์ในขณะนี้มีโอกาสที่สั้นที่จะเปิดมันทำลายการรักษาความปลอดภัย

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

GNU touchยังคงไม่ล้มเหลวหากผ่าน-fตัวเลือก แต่เพียงข้ามแฟล็ก ด้วยวิธีนี้สคริปต์ที่เขียนขึ้นสำหรับ BSD เวอร์ชันเก่าเหล่านี้จะไม่ล้มเหลวเมื่อถูกย้ายไปยังระบบ GNU ไม่ค่อยมีความเกี่ยวข้องในทุกวันนี้


3
ตามdeveloper.apple.com/library/mac/documentation/Darwin/Reference/ … -fยังคงใช้งานได้ใน Mac OS X (แต่ไม่ต้องสงสัยเลยว่ามีอย่างน้อย 57 วิธีที่แตกต่างกันในการทำงานของฟังก์ชั่นเดียวกัน "ดีกว่า" โดยใช้ GUI! )
alephzero

20
การใช้ GUI ไม่จำเป็นต้อง "ดีกว่า" ประเด็นของการใช้สคริปต์กำลังทำให้สิ่งต่าง ๆ เป็นอัตโนมัติซึ่งรวมถึงการทำให้แน่ใจว่าสคริปต์ของคุณจะไม่ได้รับการแก้ไขในภาษาถิ่นที่เป็นยูนิกซ์มากที่สุดหรืออย่างน้อยก็ในภาษาส่วนใหญ่ที่คุณอาจพบเจอ .
Guntram Blohm สนับสนุน Monica

@alephzero นั่นเป็นเพราะเวอร์ชั่นใน OS X เป็นเวอร์ชั่น BSD ซึ่ง GNU ยังคงใช้งานร่วมกันได้
Barmar

14

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

ในฐานะที่เป็นตัวเลือกที่ถูกเพิกเฉย-fมีอยู่ในเวอร์ชันแรกของtouchคำสั่งGNU ที่เพิ่มในปี 1992 ( ดูต่าง ) ดูเหมือนว่าอย่างน้อยใน FreeBSD v9 -f"พยายาม [s] เพื่อบังคับการอัปเดตแม้ว่าการอนุญาตไฟล์จะไม่อนุญาตในขณะนี้" (ตามที่ Sukminder พบขอบคุณ)


2
infoหน้าพูดว่าละเว้น สำหรับความเข้ากันได้กับ `touch 'รุ่น BSD
heemayl

@ heemayl ยกเว้นว่าฉันไม่สามารถหา BSD ที่ดูเหมือนว่าจะส่งมาพร้อมกับอาร์กิวเมนต์ "-f" เพื่อสัมผัสดังนั้นมันจึงค่อนข้างเก่า
Chris Down

อืม .. ฉันเพิ่งตรวจสอบคู่มือ Coreutilsซึ่งพูดว่า: "ละเว้น; สำหรับความเข้ากันได้กับรุ่นสัมผัส BSD"
Pandya

3
-fis / ถูกใช้เพื่อพยายามบังคับให้อัพเดตแม้ว่าการอนุญาตไฟล์จะอนุญาตใน BSD ไม่ใช่ใน V10 แต่เป็น v9: freebsd.org/cgi/… (อย่างน้อย FreeBSD)
Runium

@sukminder Ace ขอบคุณ! ฉันจะเพิ่มข้อมูลของคุณลงในคำตอบ
Chris Down

12

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

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


0

เมื่อดูความคิดเห็นในซอร์สโค้ดประวัติศาสตร์บรรทัดที่ 22:

  22   -f                     (ignored)\n\

อ็อพชัน -f ตั้งใจที่จะถูกละเว้นตั้งแต่การปล่อยครั้งแรกโดย Jim Meyering

และคำสั่ง switch เพื่อจัดการกับตัวเลือกมีตัวพิมพ์เล็ก (บรรทัด 150/151) ที่ไม่ทำอะไรเลย:

 150         case 'f':
 151           break;

เป็นที่น่าสังเกตว่าสิ่งใดเป็นแรงบันดาลใจให้ผู้เขียนต่อไปนี้ตั้งแต่ปี 1992 เพื่อไม่ให้ตัวเลือกนี้ถูกเพิกเฉย อาจจะมีสถานการณ์การใช้งานที่ต้องใช้ตัวเลือก -f และแบ่งเป็นอย่างอื่น?

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