mkdir#
יוצר ספרייה יחידה במערכת הקבצים.
mkdir asks the operating system to create the directory named by FILENAME, with permission bits given by MODE (further restricted by the process umask). It creates exactly one directory
every parent component in
FILENAMEmust already exist. For recursive creation, reach forFile::Path::make_pathinstead.
תקציר#
mkdir FILENAME, MODE
mkdir FILENAME
mkdir
מה מקבלים בחזרה#
1 בהצלחה, 0 בכשל עם $! קבוע ל־errno של המערכת. בניגוד לרוב פרימיטיבי I/O, ערך הכשל הוא 0 שקרי פשוט, לא undef - בדקו את ערך ההחזרה, ואז התייעצו עם $! לסיבה:
mkdir $path, 0755
or die "mkdir $path failed: $!";
ארגומנטי ברירת מחדל#
לשני הארגומנטים ברירות מחדל:
ברירת המחדל של
MODEהיא0777. הקרנל מסכך את המצב המסופק עם ה־umaskשל התהליך הנוכחי, כך שהמצב האפקטיבי של הספרייה הואMODE & ~umask.umaskטיפוסי של022הופך את ברירת המחדל0777ל־0755על הדיסק.ברירת המחדל של
FILENAMEהיא$_.mkdir;חשוף בתוך לולאה על שמות נתיבים יוצר כל אחד בתורו:mkdir for qw(logs cache tmp);
העבירו את MODE במפורש בכל פעם שהספרייה צריכה להיות פרטית (mail spools, אחסון מפתחות, ספריות session). אחרת העדיפו MODE מקל ותנו ל־umask של המשתמש לצמצם אותו - הדף umask דן בפרשנות בפירוט. הגדרת ביטים מחוץ לטווח ההרשאה (לדוגמה setuid/setgid/sticky) מניבה התנהגות מוגדרת־מימוש לפי POSIX 1003.1-2008.
מצב גלובלי שהוא נוגע בו#
דוגמאות#
יצירת ספרייה עם מצב מפורש:
mkdir "build", 0755
or die "mkdir build: $!";
יצירה רק אם חסר, מבלי להתייחס ל־״כבר שם״ כשגיאה:
use Errno qw(EEXIST);
unless (mkdir "cache", 0700) {
die "mkdir cache: $!" unless $! == EEXIST;
}
ספרייה פרטית - אל תניחו ל־umask להרחיב אותה:
mkdir "$ENV{HOME}/.secrets", 0700
or die "mkdir secrets: $!";
צורה חשופה על רשימה, שימוש ב־$_ כשם הקובץ:
for (qw(a b c)) {
mkdir or warn "mkdir $_: $!";
}
יצירה רקורסיבית אינה תפקידו של mkdir - השתמשו ב־File::Path:
use File::Path qw(make_path);
make_path("var/log/app/2026", { mode => 0755 })
or die "make_path failed: $!";
מקרי קצה#
ההורה חייב להיות קיים.
mkdir "a/b/c"נכשל עםENOENTאםa/bחסר. השתמשו ב־File::Path::make_pathעבור נתיבים עמוקים.היעד כבר קיים. נכשל עם
EEXIST, ללא קשר אם הרשומה הקיימת היא ספרייה, קובץ או symlink. בדקו את$!מולErrno::EEXISTכאשר ״כבר שם״ מקובל.לוכסנים גוררים. POSIX 1003.1-1996 מתיר כל מספר של לוכסנים גוררים; Perl מסיר אותם לפני ה־syscall כך שמערכות קבצים שדוחות
"foo/"עדיין יתנהגו באופן עקבי.אי־התאמת הרשאות.
MODEמסוכך על־ידיumask. אם אתם זקוקים למצב מדויק על הדיסק, או שמרו ושחזרו את ה־umask, או הפעילוchmodעל הספרייה לאחר היצירה:mkdir $dir, 0700 or die $!; chmod 0700, $dir; # defeat any umask surprises
MODEomitted entirely.mkdir $pathismkdir $path, 0777still masked by
umask, so the on-disk mode is typically0755, not0777.
ביטים שאינם של הרשאה ב־
MODE. ביטי setuid / setgid / sticky על קריאתmkdirבעלי תוצאות מוגדרות־מימוש. הגדירו אותם עםchmodעוקב אם אתם זקוקים להם.מערכת קבצים לקריאה־בלבד או הרשאת כתיבה חסרה על ההורה נכשלת עם
EROFSאוEACCESבהתאמה.$!מבחין ביניהם.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
rmdir- מסיר ספרייה ריקה; הפעולה ההופכיתchmod- התאמת ביטי הרשאה לאחר היצירה כאשרumaskהיה אחרת מצמצם אותםumask- המסכה שמגבילה בשקט כלmkdir MODEstat- בדיקת סוג ומצב של נתיב קיים, לדוגמה כדי להבחין בין ״כבר ספרייה״ ל־״קיים כקובץ״File::Path::make_path- יצירת ספריות רקורסיבית; הכלי הנכון כאשר הורים ביניים עלולים שלא להיות קיימים