unix softlinks والمسارات
سؤال
أنا مرتبك إلى حد ما كيف تعمل الروابط الناعمة في يونيكس. انظر المثال.
% cd /usr/local/
% ls -la
total 6
drwxr-xr-x 2 root root 512 Jan 19 15:03 .
drwxr-xr-x 41 root sys 1024 Jan 20 16:24 ..
lrwxrwxrwx 1 root root 38 Jan 19 15:03 java -> /otherDir/java/jdk1.6.0_17 **<- this is a soft link**
% cd java **<- move to the softlink**
% pwd
/usr/local/java **<- the current location, say LOCATION_A**
% cd /otherDir/java/jdk1.6.0_17/ **<-move to the location of the softlink**
% pwd
/otherDir/java/jdk1.6.0_17 **<- the new current location, say LOCATION_B**
أليس هذه مشكلة أنه على الرغم من أن الموقع _a هو الموقع ، فإن لديهم مسارات مختلفة؟
هل هناك أمر (بخلاف PWD) من شأنه أن يعطي الموقع الحقيقي لملف (وليس فقط كيف يذهب المستخدم إلى هناك).
يبدو لي أن PWD هو مجرد مجموع قرص مضغوط للمستخدم. ليس موقعهم الحالي.
المحلول
هذا يتصرف مثل هذا مع الغرض. إذا قمت بالقرص المضغوط إلى /a/b/c/d
ثم القرص المضغوط ..
ثم تتوقع واقعيا أن تكون في /a/b/c
. لو c
يحدث أن يكون رابطًا رمزيًا (أو Symlink من حيث Unix - ولكن ليس الرابط الناعم) الذي يأخذك /f/g/h
, ، مع السلوك الذي تود أن ينتهي بك الأمر /f/g
ثم أنت (أو أي برنامج) لن تفهم كيف وصلت إلى هناك.
نصائح أخرى
محاولة pwd -P
. إنها ليست "بخلاف PWD" ولكنها تقوم بالخدعة ، على الأقل على Bash 4.0.35 على Fedora 12. YMMV.
تحديث: حتى يعمل مع sh
, ، لذلك يبدو أنه محمول.
يمكنك استخدام READLINK على دليل العمل الحالي للحصول على اسم الدليل الحقيقي:
readlink `pwd`
عادة، pwd
يجب أن تعود /usr/local/java
في السطر الأخير ، إذا فهمت مثالك. لكن بعض الأصداف لديها ملف بناء في pwd
القيادة التي تحاول أن تكون أكثر "ذكاء" معالجة الارتباطات في دليل العمل الحالي.
محاولة /bin/pwd
, ، هل تحصل على نتائج أخرى؟
RealPath هل ما تريد.
لا يمكن الحصول على طريقك على الإطلاق في جميع الظروف. هذا غريب بعض الشيء ، ولكن يتم استخدام تباين في هذا (بالإضافة إلى chroot و setuid) في بعض الأحيان لقفل العملية.
$ mkdir -p /tmp/a/b $ cd /tmp/a/b $ rmdir /tmp/a/b $ chmod 0 /tmp/a $ rmdir /tmp/a $ ls .. ls: cannot open directory ..: Permission denied $ ls -al total 0 $ pwd -P pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory