كيفية حل الروابط الرمزية في برنامج نصي للشيل

يمكن أن يكون العمل مع الروابط الرمزية (أو symlinks) في أنظمة شبيهة بـ Unix أمرًا معقدًا في بعض الأحيان، خاصةً عندما تريد معرفة المسار الفعلي الذي تشير إليه symlink. إذا كنت تكتب برنامجًا نصيًا للشيل وتحتاج إلى تحديد المسار الكامل لهدف معين بعد حل أي روابط رمزية وسيطة، فأنت في المكان الصحيح. في هذه التدوينة، سنوضح كيفية تحقيق ذلك بكفاءة.

فهم المشكلة

تخيل أنك تواجه حالة حيث لديك رابط رمزي يسمى foo يشير إلى دليل آخر يسمى bar. عندما تقوم بتنفيذ أوامر مثل cd foo و pwd، قد لا تكشف شيل لديك الهيكل الأساسي بوضوح، مما يجعل من الصعب استنتاج المسار الكامل إلى الهدف.

على سبيل المثال:

ls -ld foo bar
drwxr-xr-x   2 greg  greg  68 Aug 11 22:36 bar
lrwxr-xr-x   1 greg  greg   3 Aug 11 22:36 foo -> bar

إذا كنت ستنفذ:

cd foo
pwd

فستكون النتيجة ببساطة /Users/greg/tmp/foo، وهو أمر لا يساعدك حقًا إذا كان هدفك هو اكتشاف المسار الفعلي الذي يشير إليه foo، وهو /Users/greg/tmp/bar.

الحل

لحسن الحظ، هناك أوامر مدمجة يمكن أن تساعدك على حل الروابط الرمزية في برنامج نصي للشيل دون الحاجة إلى الخوض في برمجة C. إليك كيفية القيام بذلك:

استخدام أمر pwd

يستخدم الأمر pwd -P لطباعة الدليل العامل الحالي، مع حل جميع الروابط الرمزية لتوفير المسار المطلق للهدف. عند تنفيذك:

pwd -P

سيرجع المسار الكامل بعد حل أي روابط رمزية.

استخدام getcwd

طريقة أخرى لتحقيق ذلك هي استخدام دالة getcwd من مكتبة unistd.h في C. ومع ذلك، إذا كنت تكتب نصًا، يمكنك الاعتماد على أوامر الشيل بدلاً من ذلك. من الجيد معرفة أن getcwd له سلوك مشابه لـ pwd -P.

بناء دالة الحل

يمكنك تجميع هذه الأوامر في دالة لتسهيل عملك. إليك مثالاً لدالة resolve بسيطة في شيل Bash:

resolve() {
    # استخدم المسار المقدم وحله
    local target=$1
    # `readlink -f` يتبع الروابط الرمزية ويعيد المسار الكامل
    local full_path=$(readlink -f "$target")
    echo "$full_path"
}

مثال على الاستخدام

الآن، ببساطة اتصل بالدالة مع:

resolve "foo"

سيعيد ذلك:

/Users/greg/tmp/bar

تسمح لك هذه النمطية بالوصول إلى المسار الكامل لأي رابط رمزي واجهته في بيئة برنامجك النصي للشيل.

مكافأة: حل مسارات المنزل للمستخدمين

إذا كنت تريد أيضًا حل أدلة المنزل باستخدام ترميز التلدة (مثل ~username)، تقوم Bash بتوسيع هذه المسارات تلقائيًا في برنامج نصي للشيل، لذلك يمكنك دمج ذلك مع دالة resolve الخاصة بك بسلاسة.

الخاتمة

لا يتعين أن يكون حل الروابط الرمزية في برامج النصوص معقدًا. من خلال استخدام أمر pwd -P أو إنشاء دالة مساعدة مثل resolve التي تستخدم readlink، يمكنك تحديد المسار الكامل لهدفك بفعالية. هذه المهارة ضرورية لأي شخص يعمل في بيئة شبيهة بـ Unix وتجعل برامجك النصية أكثر قوة وفائدة.

تذكر أن إدارتك الجيدة للروابط الرمزية يمكن أن توفر لك الوقت والارتباك أثناء التنقل في هياكل الأدلة أو كتابة برامج نصية معقدة للشيل.