أنا أعلم ذلك ، انساه وأعد تعلمه مرة أخرى. حان الوقت لكتابتها.
لتشغيل برنامج نصي sh
غير قابل للتنفيذ ، استخدم:
sh myscript
لتشغيل برنامج نصي bash
غير قابل للتنفيذ ، استخدم:
bash myscript
لبدء ملف قابل للتنفيذ (وهو أي ملف بإذن قابل للتنفيذ) ؛ يمكنك فقط تحديد ذلك من خلال المسار:
/foo/bar
/bin/bar
./bar
لجعل البرنامج النصي قابل للتنفيذ ، امنحه الإذن اللازم:
chmod +x bar
./bar
عندما يكون الملف قابلاً للتنفيذ ، يكون kernel مسؤولاً عن معرفة كيفية اكتشافه. بالنسبة لغير الثنائيات ، يتم ذلك من خلال النظر إلى السطر الأول من الملف. يجب أن يحتوي على hashbang
:
#! /usr/bin/env bash
يخبر hashbang kernel بالبرنامج الذي سيتم تشغيله (في هذه الحالة ، يتم تشغيل الأمر /usr/bin/env
باستخدام الوسيطة bash
). بعد ذلك ، يتم تمرير البرنامج النصي إلى البرنامج (كحجة ثانية) جنبًا إلى جنب مع جميع الوسائط التي قدمتها للبرنامج كوسائط تالية.
هذا يعني يجب أن يكون لكل نص قابل للتنفيذ hashbang . إذا لم يحدث ذلك ، فأنت لا تخبر النواة بما هو هو ، وبالتالي فإن النواة لا تعرف البرنامج الذي يجب استخدامه لتفسيره. يمكن أن يكون bash
أو Perl
أو python
أو sh
أو أي شيء آخر. (في الواقع ، ستستخدم النواة شل المستخدم الافتراضي في كثير من الأحيان لتفسير الملف ، وهو أمر خطير للغاية لأنه قد لا يكون مترجمًا صحيحًا على الإطلاق أو قد يكون قادرًا على تحليل جزء منه ولكن مع وجود اختلافات سلوكية دقيقة مثل الحالة بين sh
و bash
).
/usr/bin/env
الأكثر شيوعًا ، سترى علامات التجزئة مثل:
#!/bin/bash
والنتيجة هي أن النواة ستقوم بتشغيل البرنامج /bin/bash
لتفسير البرنامج النصي. لسوء الحظ ، bash
لا يتم شحنها دائمًا افتراضيًا ، ولا يتوفر دائمًا في /bin
. أثناء وجوده على أجهزة Linux ، توجد مجموعة من أجهزة POSIX الأخرى حيث bash
يشحن في مواقع مختلفة ، مثل /usr/xpg/bin/bash
أو /usr/local/bin/bash
.
لكتابة نص برمجي محمول ، لا يمكننا بالتالي الاعتماد على ترميز موقع برنامج bash
الثابت. لدى POSIX بالفعل آلية للتعامل مع ذلك: PATH
. الفكرة هي أن تقوم بتثبيت برامجك في أحد الأدلة الموجودة في PATH
ويجب أن يكون النظام قادرًا على العثور على البرنامج عندما تريد تشغيله بالاسم.
للأسف ، أنت لا يمكنك فقط قم بذلك:
#!bash
لن يقوم النواة (قد يفعل البعض) بالبحث عن PATH
. هناك برنامج يمكنه إجراء بحث عن PATH
، على الرغم من أنه يطلق عليه env
. لحسن الحظ ، يوجد في جميع الأنظمة تقريبًا برنامج env
مثبت في /usr/bin
. لذلك نبدأ env
باستخدام مسار مشفر ، والذي يقوم بعد ذلك بـ PATH
بالبحث عن bash
وتشغيله حتى يتمكن من تفسير البرنامج النصي الخاص بك:
#!/usr/bin/env bash
هذا النهج له جانب سلبي واحد: وفقًا لـ POSIX ، يمكن أن يكون لدى hashbang وسيطة واحدة . في هذه الحالة ، نستخدم bash
كوسيطة لبرنامج env
. هذا يعني أنه ليس لدينا مساحة متبقية لتمرير الوسائط إلى bash
. لذلك لا توجد وسيلة لتحويل شيء مثل #!/bin/bash -exu
إلى هذا المخطط. سيكون عليك وضع set -exu
بعد hashbang بدلاً من ذلك.
تتميز هذه الطريقة أيضًا بميزة أخرى: قد تشحن بعض الأنظمة بـ /bin/bash
، لكن المستخدم قد لا يعجبه ، وقد يجد أنه عربات التي تجرها الدواب أو قديم ، وقد يكون قد قام بتثبيت bash
في مكان آخر. هذا هو الحال غالبًا على OS X (Macs) حيث تشحن Apple /bin/bash
عفا عليها الزمن ويقوم المستخدمون بتثبيت /usr/local/bin/bash
محدثًا باستخدام شيء مثل Homebrew. عند استخدام الأسلوب env
الذي يقوم بالبحث PATH
، فأنت تأخذ تفضيل المستخدم في الاعتبار وتستخدم باش المفضل لديه على النظام الذي يتم شحنه به.
لبدء تشغيل ملف shell-script 'file.sh':
sh file.sh
bash file.sh
خيار آخر هو تعيين إذن قابل للتنفيذ باستخدام الأمر chmod:
chmod +x file.sh
قم الآن بتشغيل ملف .sh كما يلي:
./file.sh
بالنسبة لشركة شل بورن:
sh myscript.sh
للباش:
bash myscript.sh
إذا كنت تريد تشغيل البرنامج النصي في Shell الحالي (على سبيل المثال ، تريد أن تكون قادرة على التأثير على الدليل أو البيئة) ، يجب أن تقول:
. /path/to/script.sh
أو
source /path/to/script.sh
لاحظ أن /path/to/script.sh
يمكن أن يكون نسبيًا ، على سبيل المثال . bin/script.sh
يعمل على script.sh
في دليل bin
ضمن الدليل الحالي.
يتم تعيين ملحق الملف .command إلى Terminal.app. النقر المزدوج على أي ملف .command سيتم تنفيذه.
أولاً ، إعطاء إذن للتنفيذ: -chmod +x script_name
sh script_name
bash script_name
./script_name
NOTE: - يمكنك التحقق مما إذا كان الملف قابل للتنفيذ أم لا باستخدام 'ls -a'