สมมติว่าคุณรู้ว่าเป้าหมายคือลิงก์สัญลักษณ์และไม่ใช่ไฟล์มีความแตกต่างระหว่างการใช้rm
และunlink
การลบลิงก์หรือไม่
สมมติว่าคุณรู้ว่าเป้าหมายคือลิงก์สัญลักษณ์และไม่ใช่ไฟล์มีความแตกต่างระหว่างการใช้rm
และunlink
การลบลิงก์หรือไม่
คำตอบ:
เมื่อใดก็ตามที่คุณมีคำถามประเภทนี้คุณควรทดสอบข้อสอบเล็กน้อยเพื่อดูว่าเกิดอะไรขึ้นจริง strace
สำหรับนี้คุณสามารถใช้
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
เมื่อคุณดูแฟ้มบันทึกผลลัพธ์ 2 รายการคุณสามารถ "เห็น" การโทรแต่ละครั้งทำอะไรได้จริง
ด้วยunlink
การเรียกใช้การunlink()
เรียกระบบ:
....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3) = 0
unlink("file1") = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
....
ด้วยrm
เส้นทางที่แตกต่างกันเล็กน้อย:
....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid() = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK) = 0
unlinkat(AT_FDCWD, "file1", 0) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
...
สายระบบunlink()
และunlinkat()
เป็นหลักเดียวกันยกเว้นสำหรับความแตกต่างที่อธิบายไว้ในหน้าคนนี้: http://linux.die.net/man/2/unlinkat
การเรียกใช้ระบบ unlinkat () ทำงานในลักษณะเดียวกับ unlink (2) หรือ rmdir (2) (ขึ้นอยู่กับว่าธงนั้นมีธง AT_REMOVEDIR หรือไม่) ยกเว้นความแตกต่างที่อธิบายไว้ในหน้าคู่มือนี้
หากชื่อพา ธ ที่กำหนดในชื่อพา ธ นั้นสัมพันธ์กันมันจะถูกแปลความสัมพันธ์กับไดเรกทอรีที่อ้างถึงโดยไฟล์ descriptor dirfd (แทนที่จะเป็นญาติกับไดเรกทอรีการทำงานปัจจุบันของกระบวนการเรียกเช่นเดียวกับ unlink (2) และ rmdir (2) ) สำหรับชื่อพา ธ สัมพัทธ์)
หากชื่อพา ธ ที่กำหนดในชื่อพา ธ นั้นสัมพันธ์กันและ dirfd เป็นค่าพิเศษ AT_FDCWD ดังนั้นชื่อพา ธ จะถูกแปลความสัมพันธ์กับไดเรกทอรีการทำงานปัจจุบันของกระบวนการเรียก (เช่น unlink (2) และ rmdir (2))
หากชื่อพา ธ ที่กำหนดในชื่อพา ธ เป็นสัมบูรณ์ดังนั้น dirfd จะถูกละเว้น
AT_FDCWD
มีประสิทธิภาพแตกต่างระหว่างไม่มีและunlink
unlinkat
POSIX ระบุว่าunlink
ยูทิลิตี้เรียกunlink
ฟังก์ชั่นห้องสมุด C และไม่มีอะไรอื่น ไม่มีตัวเลือก หากคุณส่งชื่อพา ธ ที่ถูกต้องไปยังสิ่งที่ไม่ใช่ไดเรกทอรีและถ้าคุณมีสิทธิ์ในการเขียนไปยังไดเรกทอรีที่วัตถุนั้นมีชีวิตอยู่ก็unlink
จะลบออก
rm
เป็นคำสั่ง Unix แบบดั้งเดิมซึ่งมีฟังก์ชั่นอื่น ๆ อยู่บ้างและไม่ได้เป็นชุดของunlink
(ดูด้านล่าง)
ประการแรกrm
ทำการตรวจสอบความปลอดภัย หากคุณลองrm
วัตถุที่คุณไม่มีสิทธิ์เขียน (ซึ่งไม่เกี่ยวข้องกับความสามารถของคุณในการลบออก: สิทธิ์โดยตรงคือ!) rm
อย่างไรก็ตามจะปฏิเสธเว้นแต่-f
จะระบุไว้ rm
โดยปกติจะบ่นว่าไฟล์ไม่มีอยู่จริงเช่นเดียวกับunlink
; แต่ด้วย-f
, rm
ไม่บ่น วิธีนี้มักใช้ใน Makefiles ( clean: @rm -f $(OBJS) ...
) ดังนั้นจึงmake clean
ไม่ล้มเหลวเมื่อไม่มีสิ่งใดที่จะลบ
ประการที่สองrm
มี-i
ตัวเลือกสำหรับยืนยันการลบแบบโต้ตอบ
ประการที่สามrm
มี-r
การลบไดเรกทอรีซ้ำซึ่งเป็นสิ่งที่unlink
ไม่จำเป็นต้องทำเนื่องจากฟังก์ชั่นห้องสมุด C ไม่ได้ทำเช่นนั้น
ยูทิลิตี้ไม่ว่าปล้นลงunlink
rm
จะดำเนินการส่วนหนึ่งของสิ่งที่rm
ไม่ แต่มันมีความหมายซึ่งเป็นชุดของrm
มี -f
และ RM โดยไม่ต้อง -f
สมมติว่าคุณต้องการเพียงแค่ลบไฟล์ปกติโดยไม่คำนึงถึงสิทธิ์ของตนเอง นอกจากนี้สมมติว่าคุณต้องการให้คำสั่งล้มเหลวหากไฟล์ไม่มีอยู่หรือด้วยเหตุผลอื่น ทั้งrm file
มิได้rm -f file
เป็นไปตามข้อกำหนด rm file
จะปฏิเสธหากไฟล์ไม่สามารถเขียนได้ แต่rm -f file
จะไม่สนใจบ่นหากไฟล์หายไป unlink file
ทำงาน
unlink
อาจถูกนำมาใช้เพราะrm
เป็นคนฉลาดเกินไป: บางครั้งคุณก็ต้องการให้บริสุทธิ์ Unix unlink
ความหมาย: "โปรดให้รายการไดเรกทอรีนี้หายไปถ้าไดเรกทอรีสิทธิ์อนุญาตให้"
unlink
แทนที่จะอธิบายความแตกต่าง
ด้วยไฟล์เดียวrmและunlinkทำภารกิจเดียวกันลบไฟล์ ตามที่กำหนดไว้ใน POSIX rm
และunlink
ทั้งการเรียกเพื่อยกเลิกการเชื่อมโยง () การโทรของระบบ
ใน GNU rm
จะเรียกใช้เพื่อยกเลิกการเชื่อมโยงการเรียกระบบซึ่งเทียบเท่ากับฟังก์ชั่นunlink()
หรือrmdir ()ยกเว้นในกรณีที่เส้นทางระบุเส้นทางที่สัมพันธ์กัน
บันทึก
ในบางระบบunlink
สามารถลบไดเรกทอรีได้ อย่างน้อยที่สุดในระบบ GNU unlink
ไม่สามารถลบชื่อไดเรกทอรีได้