Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

קבצים והתקנות - "רענון" תיקיה שנמחקה ונוצרה מחדש

Anonymous - 01/09/2018 - 15:52
נושא ההודעה: "רענון" תיקיה שנמחקה ונוצרה מחדש
לא משהו נפוץ במיוחד, אבל יוצא לי לפעמים להיות במצב כזה - פתוחים לי שני טרמינלים, באחד אני עושה:

קוד:

$ cd ~/foo


ולאחר מכן אני עושה בשני:

קוד:

$ rm -rdf ~/foo
$ mkdir ~/foo
$ touch ~/foo/bar


ואז כשאני חוזר לראשון ועושה:

קוד:

$ ls


אני מקבל שגיאה שהתיקייה לא קיימת. אני מניח שמה שקורה זה שהטרמינל "יודע" איפה הוא לפי inode או איזה מזהה קאנוני של התיקייה, ואז למרות ששם הנתיב שבו הוא כביכול נמצא קיים, המקום הפיזי שבו הוא חושב שהוא כבר לא.
השאלה היא קודם כל - האם ההסבר הזה נכון, או מה ההסבר המדויק?
והשאלה השניה היא - האם יש דרך "לרענן" מלבד לעשות cd .. ולהכנס מחדש?

תודה.
mksoft - 02/09/2018 - 14:12
נושא ההודעה:
הכי קל:
קוד:
cd .

Anonymous - 02/09/2018 - 14:50
נושא ההודעה:
אני קצת פוחד משימוש ב־. בהקשר הזה ותמיד משתמש בנתיב המלא:
קוד:

cd $PWD

borsood - 03/09/2018 - 07:15
נושא ההודעה: Re: "רענון" תיקיה שנמחקה ונוצרה מחדש
SF :
אני מניח שמה שקורה זה שהטרמינל "יודע" איפה הוא לפי inode או איזה מזהה קאנוני של התיקייה, ואז למרות ששם הנתיב שבו הוא כביכול נמצא קיים, המקום הפיזי שבו הוא חושב שהוא כבר לא.
השאלה היא קודם כל - האם ההסבר הזה נכון, או מה ההסבר המדויק?
והשאלה השניה היא - האם יש דרך "לרענן" מלבד לעשות cd .. ולהכנס מחדש?
תודה.

לא הטרמינל אלא המעטפת (shell) מחזיקה את ה CWD כקובץ פתוח בתוך מבני הנתונים הפנימיים של התהליך. לכן גם כשאתה עושה rmdir או rm -r, הקובץ (מדריך directory) הישן לא נמחק בפועל את שהמעטפת לא תסגור אותו מה שיקרה בפקודת cd, אבל לתהליכים אחרים אין גישה אליו. מבחינה זו אין הבדל בין מדריך או קובץ רגיל.
כדי לרענן צריך לגרום למערכת לסגור את המדריך על ידי פקודת cd כמו שכתבת.
קוד:
cd .
בדרך כלל לא יעבוד.
הערה: במערכות קבצים מבוססות רשת כמו NFS או CIFS ההתנהגות היא שונה.
Anonymous - 03/09/2018 - 18:47
נושא ההודעה:
לא בדיוק ה־shell. מדובר (גם) על ליבת המערכת.

קוד:

$echo $$
19022
$ mkdir /tmp/test_dir
$ cd /tmp/test_dir
[test_dir] $ ls -lia .
total 4
  1774493 drwxr-xr-x  2 tzafrir  tzafrir     6 Sep  3 18:28 .
134296306 drwxrwxrwt 24 root     root     4096 Sep  3 18:28 ..

ועכשיו משהו שאפשר להריץ גם ממסוף אחר:
קוד:

$ ls -lia /proc/19022/cwd/
total 4
  1774493 drwxr-xr-x  2 tzafrirc tzafrirc    6 Sep  3 18:28 .
134296306 drwxrwxrwt 24 root     root     4096 Sep  3 18:29 ..
$ rmdir /tmp/test_dir
$ ls -lia /proc/19022/cwd/
total 0
$ ls -l /proc/19022/cwd
lrwxrwxrwx 1 tzafrir  tzafrir  0 Aug 26 06:24 /proc/19022/cwd -> '/tmp/test_dir (deleted)'
$ mkdir /tmp/test_dir
$ ls -lia /proc/19022/cwd
7399647 lrwxrwxrwx 1 tzafrir  tzafrir  0 Aug 26 06:24 /proc/19022/cwd -> '/tmp/test_dir (deleted)'

כמוכן cd .‎ עבד במקרה הזה (מערכת קבצים: xfs).
כל הזמנים הם GMT + 2 שעות