ENOENT (errno 2)

errno 2

LINUX

الرسالة الرسمية (كما تظهر على الشاشة): No such file or directory

يُبحث عنه أيضًا باسم: No such file or directory, errno 2, ENOENT: no such file or directory, npm ERR! code ENOENT, FileNotFoundError

طرفية Linux تشغّل strace مع إبراز استدعاء النظام الفاشل وقيمة errno
errno في Linux: تتبّع استدعاء النظام الفاشل بدقة قبل تغيير أي شيء.

ماذا يعني

تعني ENOENT، أي 'No such file or directory' (errno 2)، أن مساراً يستخدمه البرنامج غير موجود. وهي من أكثر الأخطاء شيوعاً في الصدفة وNode.js ('ENOENT: no such file or directory, open ...') وPython (FileNotFoundError) وأدوات البناء. وأحياناً لا يكون المفقود هو الملف الذي تتوقعه، بل مفسّر أو مكتبة يحتاج إليها.

ينطبق على: Linux, macOS (BSD errno), WSL, حاويات Docker

كيفية إصلاح ENOENT (errno 2)

  1. اطبع المسار الدقيق من رسالة الخطأ وافحصه بالأمر 'ls -la <path>'؛ وانتبه إلى الأخطاء الإملائية وحالة الأحرف، لأن مسارات Linux حساسة لحالة الأحرف
  2. افحص مجلد العمل الحالي بالأمر 'pwd'؛ فالمسارات النسبية تُحلّ من المكان الذي بدأ منه البرنامج، وليس من مجلد السكربت
  3. عند 'npm ERR! enoent'، شغّل الأمر في المجلد الذي يحتوي package.json، ثم 'npm install' إذا كان node_modules مفقوداً
  4. إذا كان السكربت موجوداً لكن تشغيله يعطي 'No such file or directory'، فتأكد من وجود مفسّر shebang، وأصلح نهايات الأسطر الخاصة بـ Windows بالأمر 'dos2unix script.sh'
  5. افحص الروابط الرمزية المكسورة بالأمرين 'ls -l' و'readlink -f <path>'
  6. تتبّع المسار المفقود بالأمر 'strace -f -e trace=openat,execve <command> 2>&1 | grep ENOENT'
  7. في Docker، تأكد من أن الملف نُسخ إلى الصورة أو رُبط بها، وأن المسارات تطابق الحاوية وليس المضيف

سبب حدوثه

أي بحث عن مسار يفشل عند مكوّن مفقود يُرجع ENOENT: ملفات محذوفة أو لم تُنشأ أبداً، أو مجلد عمل خاطئ، أو روابط رمزية مكسورة، أو مفسّرات مفقودة في shebang، أو ملفات موجودة على المضيف فقط وليس في الحاوية.

الأسئلة الشائعة

لماذا تظهر 'No such file or directory' رغم أن الملف موجود؟

غالباً يشير shebang إلى مفسّر مفقود، أو يحتوي السكربت على نهايات أسطر CRLF، أو يفتقد ملف ثنائي 32 بت إلى محمّله. يساعد الأمران 'file script' و'head -1 script' في التحديد.

كيف أصلح ENOENT في Node.js؟

ابنِ المسارات باستخدام path.join(__dirname, 'file') بدلاً من المسارات النسبية، وتأكد من وجود الملف في النسخة المنشورة.

أخطاء ذات صلة

المصدر: Linux kernel errno.h · حلول كتبها المحررون وراجعوها (راجع السياسة التحريرية)

آخر تحديث: