OOZOU
تواصلوا معنا
العودة إلى المدونة

أتقن فنون الـ Shell

إن كنتم مطوّرين، فغالبًا تقضون وقتًا طويلًا في سطر الأوامر. إليكم بعض النصائح والحيل التي تعلّمتها على مر السنين.

2 أغسطس 2020
6 دقائق للقراءة
أتقن فنون الـ Shell

أوامر أساسية يجب أن تعرفوها

إن أردتم عرض كل المجلدات والملفات في المجلد الحالي، فاستخدموا الأمر ls:

$ ls /var/log
=> system.log
=> shutdown_monitor.log
=> ...

في البرمجة، كثيرًا ما تكون لدينا ملفات إعداد مخفية. وتُسمى dotfiles لأنها تبدأ بنقطة، مثل .file** يمكنكم تعديل أمر العرض باستخدام الخيار -a (all)، مثل ls -a، الذي يعرض كل الملفات بما فيها ملفات الإعداد المخفية:

$ ls -a
=> .git/
=> .ruby-version
=> .oozou

لنفترض الآن أنكم تريدون حذف مجلد يحتوي على ملفات. بدلًا من اللجوء إلى Finder، يمكنكم استخدام الأمر rm، لكنه لا يحذف إلا الملفات المفردة أو المجلدات الفارغة. وإن احتجتم إلى حذف المجلد بأكمله، فاستخدموا الخيار -r (recursive)، مثل rm -r، الذي يحذف كل الملفات في المجلد إضافة إلى المجلد نفسه. ويمكنكم أيضًا استخدام تعبيرات wildcard لمطابقة ملفات محددة في المجلد. ربما تريدون حذف كل الملفات النصية مثلًا:

$ <em>rm -r dirname/*.txt
=> Deleted 10 files matching dirname/*.txt
language-shell</em>

أحيانًا ستجدون أن بعض الملفات محمية من الكتابة، فيُطلب منكم تأكيد رغبتكم فعلًا في حذفها. وإن كنتم تحذفون ملفات محمية من الكتابة بشكل متكرر، فقد يصبح إدخال y لتأكيد الحذف مرة بعد مرة أمرًا مرهقًا. وللتغلب على ذلك، نمرّر الخيار -f (force) لنطلب من أمر الحذف المضي قدمًا من دون سؤال:

$ <em>rm -rf dirname/write-protected.*.txt
=> Deleted 10 write protected files without bothering you for permission
language-shell</em>

بعض اختصارات الـ Shell

هل حدث أن كتبتم أمرًا ونسيتم sudo؟ هل تعلمون أنكم تستطيعون استخدام !! لإعادة تشغيل آخر أمر؟ هذا مفيد جدًا لإعادة تشغيل الأوامر الفاشلة مع sudo:

$ rm -rf /important-directory
=> permission denied
$ sudo !!
=> I'm sorry, I didn't realize it was you, go right ahead

يمكنكم عرض سجل كل أوامركم بكتابة history في سطر الأوامر:

$ history
=> 1 ls /var/log
=> 2 ls -a
=> 3 <em>rm -r dirname/*.txt</em>
=> 4 <em>rm -rf dirname/write-protected.*.txt
</em>=> 5 rm -rf /important-directory
=> 6 sudo rm -rf /important-directory

ويمكنكم أيضًا استخدام !-n (حيث n رقم) لاستدعاء الأمر الذي استخدمتموه قبل n أوامر:

$ pwd
=> /Users/joe/foo
$ cd ~
$ !-2
=> /Users/joe

ويمكنكم كذلك استخدام !substring لاستدعاء آخر أمر يبدأ بهذا النص:

$ ffmpeg -i video.flv video.mpeg
=> video.flv not found
$ ls
=> thumbnail.png
$ cd ..
$ ls
=> thumbnails/ videos/
$ cd videos
$ !ffmpeg
=> converting video.flv to video.mpeg

ثم يمكننا فعل أشياء أكثر جرأة، مثل استبدال نص في الأمر السابق:

$ rm -r dir/foo/*.rb
=> removed all ruby files in dir/foo/
$ ^foo^bar
=> removed all ruby files in dir/bar/

بعض حيل Rails التي أستخدمها كثيرًا

إضافة ملف إلى .gitignore من دون فتح المحرر أمر بسيط، يكفي أن تدفعوه إليه. (ملاحظة: احذروا من استخدام > وإلا فستستبدلون محتوى الملف بالكامل، فنحن نريد >> لإلحاق النص):

$ "public/assets" >> .gitignore
=> appended "public/assets" to .gitignore

هل تحتاجون إلى إيجاد route في تطبيق Rails؟ تعرفون جزءًا من اسمه لكنكم لستم متأكدين من الـ route بالضبط. يمكنكم البحث عنه باستخدام grep، وذلك بتمرير مخرجات bin/rails routes إلى grep عبر pipe، ثم استخدام الجزء الذي تعرفونه لتضييق النتائج:

$ bin/rails routes | grep auth
=>      oauth_token POST  /api/v1/oauth/token(.:format)        doorkeeper/tokens#create
=>     oauth_revoke POST  /api/v1/oauth/revoke(.:format)       doorkeeper/tokens#revoke
=> oauth_introspect POST  /api/v1/oauth/introspect(.:format)   doorkeeper/tokens#introspect

احفظوا مخرجات script في ملف عبر إعادة توجيه المخرجات، كما فعلنا سابقًا عند إضافة public/assets إلى .gitignore. لكن هذه المرة سنستبدل محتوى الملف بالكامل:

$ ruby ./scripts/1_million_dollars.rb > ./log/1_million_dollars.txt
=> No output here
$ cat ./log/did_i_get_1_million_dollars.txt
=> Don't you think we should maybe ask for more than a million dollars?
=> A million dollars isn't exactly a lot of money these days.
=> Virtucon alone makes over 9 billion dollars a year!

أو إن أردتم تسجيل مخرجات STDERR في ملف خاص بها:

$ ruby ./scripts/raise_allota_errors.rb 2> ./log/allota_errors.text
=> STDOUT output here
$ cat ./log/allota_errors.text
=> STDERR output here

يمكنكم استخدام less لعرض ملف. وأثناء تشغيل less، استخدموا /substring للبحث في الملف، أو السهمين up و_down_ للتنقل فيه. يشبه less الأمر more كثيرًا لكنه أسرع، لأنه لا يحمّل الملف كاملًا في الذاكرة.

$ less ./log/production.log

ويمكنكم أيضًا استخدام tail لمراقبة "ذيل" الملف في الوقت الفعلي، وهذا مفيد لمتابعة الـ logs أثناء كتابتها. احرصوا على استخدام خيار "follow" للمراقبة في الوقت الفعلي، وإلا فلن تروا سوى الأسطر الأخيرة من الملف (وإن كنتم على جهاز يدوّر الـ logs، فيمكنكم استخدام -F لمواصلة مراقبة الملف حتى بعد إعادة إنشائه أثناء التدوير):

$ tail -f ./log/production.log
=> ...
=> ...
=> ...

أوامر مفيدة أخرى

هل احتجتم يومًا إلى معرفة عدد الأسطر في ملف؟ يمكنكم استخدام wc (word-count) وتمرير الخيار -l (lines) لعدّ الأسطر:

$ wc -l ./users_dump.csv
=> 1337

ويمكنكم أيضًا استخدامه لعدّ أسطر مخرجات أي أمر، مثل معرفة عدد الملفات في مجلد:

$ ls ./node_modules | wc -l
=> 9284728927498392847393

هل احتجتم يومًا إلى كتابة أمر طويل وشعرتم بالإحباط من تجربة التحرير في الـ terminal؟ افتحوا محرركم (EDITOR) وحرّروا الأمر فيه بالضغط على ctrl-x ctrl-e:

$ some-long command ops I spelled that thing wrong ctrl-x ctrl-e
#> *opens your EDITOR*
#< save and close your editor to re-enter shell
$ some-long command I spelled correctly now

ولكي يعمل ذلك، تحتاجون إلى إضافة export EDITOR=your_editor في ملف .bashrc أو .zshrc. بعض المحررات تحتاج إلى وضع wait للعودة إلى الـ terminal بعد التحرير. وإن كنتم تستخدمون MacVim، فستحتاجون إلى تمرير أمر يُنفَّذ بعد VimLeave كما فعلت هنا_: _

export EDITOR='mvim -f -c "au VimLeave * !open -a iTerm"'

أتقن فنون الـ Shell

أرني! الـ terminal مذهل! منه بدأنا، وما زال من أقوى الأدوات في عملي اليومي. وهناك الكثير مما لم أذكره في هذا المقال أصلًا. أنصحكم بالقراءة أكثر إن أثار أي من هذا اهتمامكم. فالـ shell موجود منذ ظهور الحواسيب الحديثة، لذا تتوفر عنه كمية هائلة من المعلومات. وإن كنتم تعرفون أي حيل في الـ shell، فيسعدني أن أسمعها.

Related Articles

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

تصميم البرمجيات عملية ممتعة لكنها معقدة، تتطلب الإبداع والتفكير المنطقي ومهارات حل المشكلات.

اقرأوا المزيد
مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

يتطور المشهد الرقمي بسرعة، وعلى الشركات أن تتكيّف لتواكب الطلب المتزايد على السرعة والكفاءة والمعالجة في الوقت الفعلي.

اقرأوا المزيد
مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

يتطور قطاع التجزئة بوتيرة غير مسبوقة بفضل الذكاء الاصطناعي (AI) والواقع المعزّز (AR) وتقنيات التحوّل الرقمي. فلم تعد المتاجر التقليدية مجرد أماكن لبيع المنتجات، بل أصبحت متاجر ذكية وتفاعلية.

اقرأوا المزيد

Have a Project in Mind?

Let's discuss how we can help bring your ideas to life with our expertise in web and mobile development.

ابدأوا المحادثةhello@oozou.com
OOZOU Logo

بانكوك · سنغافورة · هونغ كونغ

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

الخدمات

  • تطوير الويب
  • وكلاء الذكاء الاصطناعي والذكاء الاصطناعي التوليدي
  • تطوير تطبيقات الجوال
  • تحليلات البيانات وهندستها
  • تصميم تجربة المستخدم وواجهته (UX/UI) وتصميم المنتجات
  • التحوّل الرقمي

الشركة

  • من نحن
  • الوظائف
  • المدونة
  • دراسات الحالة
  • عروض حية
  • تعلّمت اليوم
  • تواصل معنا

المزيد

  • القطاعات
  • شبكة الشركاء
© 2026 OOZOU. جميع الحقوق محفوظة.
سياسة الخصوصيةمدونة قواعد السلوكسياسة مكافحة الرشوة والفساد