unlink#
מסיר רשומה אחת או יותר בספרייה המכנות קבצים.
unlink מבקש מהקרנל לבטל את הקישור בין כל שם ב־LIST לבין הקובץ שאליו הוא מתייחס. אם הקישור הזה היה האחרון ושום תהליך עוד לא מחזיק את הקובץ פתוח, האחסון של הקובץ משוחרר; אחרת הקובץ נשאר בדיסק, ללא שם אך נגיש דרך כל descriptor פתוח, עד שה־handle האחרון נסגר. unlink פועל על רשומות ספרייה, לא על תוכן קבצים.
תקציר#
unlink LIST
unlink
מה מקבלים בחזרה#
מספר הקבצים ש־unlink למעשה הסיר, כמספר שלם. בהצלחה מלאה הוא שווה ל־scalar @LIST; בכשל חלקי או מלא הוא מונה השמות שהוסרו לפני ואחרי אלה שנכשלו. אפס הוא ערך החזרה ״שקרי״ תקף כאשר דבר לא ניתן להסיר. $! נקבע לשגיאה מהקריאה האחרונה שנכשלה - הוא אינו מציין איזה שם נכשל.
my $removed = unlink 'a', 'b', 'c';
unlink @goners;
unlink glob "*.bak";
אם LIST מושמט, unlink פועל על שם הקובץ הבודד שב־$_.
מצב גלובלי שהוא נוגע בו#
לגלות איזה קובץ נכשל#
unlink מחזיר מונה, לא סטטוס פר־קובץ, ודורס את $! בכל איטרציה. כדי לייחס שגיאות לשמות בודדים, קראו ל־unlink פעם אחת לכל קובץ:
foreach my $file (@goners) {
unlink $file
or warn "could not unlink $file: $!";
}
הצורה פר־קובץ גם מאפשרת לכם להמשיך לאחר כשל, מה שצורת הרשימה עושה משתמעת אבל בשתיקה.
ספריות#
unlink אינו מסיר ספריות. בלינוקס הוא מחזיר 0 וקובע את $! ל־EISDIR כאשר מבוקש לעשות זאת. ה־binary של perl מזהה מתג שורת־פקודה -U ש, בשילוב עם הרצה כ־super-user, מבטל את הבדיקה - אך גם אז ביצוע unlink על ספרייה עוקף את הבטחות שלמות הספריות של מערכת הקבצים ועלול לפגום במונה הקישורים של ספריית האב. השתמשו ב־rmdir במקום; הוא קורא ל־rmdir(2), שזה ה־syscall הנכון להסרת רשומת ספרייה ריקה.
rmdir $dir or die "rmdir $dir: $!"; # correct
unlink $dir; # fails with EISDIR
סמנטיקת מחיקה של POSIX#
unlink מסיר את השם, לא את הקובץ. כל עוד תהליך כלשהו מחזיק את הקובץ פתוח, הנתונים וה־inode של הקובץ נשארים תקפים ואותו תהליך יכול להמשיך לקרוא ולכתוב דרך ה־descriptor שלו. האחסון משוחרר רק כאשר השם האחרון נעלם וגם ה־descriptor האחרון נסגר. זוהי התבנית האידיומטית ליצירת קובץ זמני שמנקה את עצמו גם בקריסה:
open my $fh, "+>", $path or die "open $path: $!";
unlink $path or die "unlink $path: $!";
# $fh is still usable; $path is gone from the directory.
# When $fh closes or the process exits, the storage is freed.
זו גם הסיבה שתוכנית רצה־לאורך־זמן יכולה להמשיך לכתוב לקובץ log ששמו עבר unlink על־ידי מפעיל - הכתיבות מצליחות, אך שום דבר בדיסק אינו נראה תחת השם הישן. df ידווח על השטח כתפוס עד שה־handle נסגר.
קישורים סימבוליים#
אם שם ב־LIST הוא קישור סימבולי, unlink מסיר את הקישור עצמו, לא את הקובץ שאליו הוא מצביע. היעד מותר ללא שינוי גם אם הקישור תלוי באוויר או מצביע על ספרייה. זה תואם את ה־syscall unlink(2) וזה כמעט תמיד מה שאתם רוצים; השתמשו ב־readlink תחילה אם אתם צריכים במיוחד לפעול על היעד.
דוגמאות#
הסירו קובץ בודד, בדקו את התוצאה:
unlink $path
or die "cannot remove $path: $!";
הסירו מספר קבצים ודווחו את הספירה:
my @files = glob "*.tmp";
my $gone = unlink @files;
warn "removed $gone of ", scalar @files, " files\n"
if $gone != @files;
אבחון פר־קובץ (הדרך האמינה היחידה לדעת איזה שם נכשל):
my @failed;
for my $f (@goners) {
unlink $f or push @failed, "$f: $!";
}
die "unlink failures:\n", join("\n", @failed), "\n" if @failed;
הסתמכו על $_ בשרשרת של בדיקות קבצים:
for (glob "*.bak") {
next unless -f && -M _ > 30; # older than 30 days
unlink or warn "skip $_: $!";
}
קובץ זמני שמנקה את עצמו (אידיום POSIX של unlink־בעת־פתיחה):
open my $scratch, "+>", "/tmp/work.$$" or die $!;
unlink "/tmp/work.$$" or die $!;
# write through $scratch, no cleanup needed on exit
מקרי קצה#
LISTריק:unlink ()מחזיר0ואינו נוגע ב־$!. העברת מערך ריק מתנהגת באותו אופן.שם לא־קיים: מחזיר
0עבור אותה רשומה וקובע את$!ל־ENOENT. שאר הרשימה עדיין מעובד.הרשאה נדחתה:
unlink(2)בודק הרשאת כתיבה על הספרייה המכילה, לא על הקובץ עצמו. הסרת קובץ שאתם לא יכולים לכתוב מותרת כל עוד אתם יכולים לכתוב את ספריית האב שלו; הסרת קובץ בבעלותכם בספרייה שאתם לא יכולים לכתוב אינה מותרת.$!יהיהEACCESאוEPERM.ספריות sticky (
/tmp, mode1777): משתמשים שאינם root יכולים לבצע unlink רק לשמות שבבעלותם. כשלים צפים כ־EPERM.ערך החזרה בהקשר בוליאני:
unlink @files or dieמופעל רק כאשר כל שם נכשל (המונה הוא0). כדי לבצע die על כל כשל, השוו ל־scalar @filesאו השתמשו בלולאה פר־קובץ.קובץ עסוק בלינוקס: לינוקס אינו מונע
unlinkשל קובץ ש־mmap עליו, רץ, או פתוח - השם מוסר וסמנטיקת POSIX לעיל חלה. מערכות הפעלה אחרות עלולות להחזירETXTBSYאוEBUSY; עמוד זה מכסה את לינוקס.מצב taint: שמות שמגיעים מנתונים מוכתמים מותרים כאופרנדים ל־
unlink; ראוperlsecלהסתייגויות הרגילות לגבי קבלת נתיבים לא־מהימנים.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
rmdir- מסיר ספרייה ריקה; הכלי הנכון כאשר השם מתייחס לרשומת ספרייה מסוגDIRrename- מעביר או מקשר מחדש שם מבלי לבטלו, לרוב משולב עםunlinkכשמחליפים קובץ אטומיתlink- יוצר קישור קשיח נוסף לקובץ;unlinkהוא ההיפוך שלו עבור שם אחד בכל פעםsymlink- יוצר קישור סימבולי; שימו לב ש־unlinkמסיר את ה־symlink עצמו, לא את היעד שלוtruncate- מצמצם קובץ במקום מבלי לבצע עליו unlink כאשר רוצים להשתמש שוב בשם