كيفية حل الروابط الرمزية في برنامج نصي للشيل
يمكن أن يكون العمل مع الروابط الرمزية (أو 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 وتجعل برامجك النصية أكثر قوة وفائدة.
تذكر أن إدارتك الجيدة للروابط الرمزية يمكن أن توفر لك الوقت والارتباك أثناء التنقل في هياكل الأدلة أو كتابة برامج نصية معقدة للشيل.