it-swarm.asia

كيفية تشغيل برنامج نصي شل على وحدة تحكم يونيكس أو محطة ماك؟

أنا أعلم ذلك ، انساه وأعد تعلمه مرة أخرى. حان الوقت لكتابتها.

488
P-A

لتشغيل برنامج نصي 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 ، فأنت تأخذ تفضيل المستخدم في الاعتبار وتستخدم باش المفضل لديه على النظام الذي يتم شحنه به.

908
lhunath

لبدء تشغيل ملف shell-script 'file.sh':

sh file.sh

bash file.sh

خيار آخر هو تعيين إذن قابل للتنفيذ باستخدام الأمر chmod:

chmod +x file.sh

قم الآن بتشغيل ملف .sh كما يلي:

./file.sh
78
P-A

بالنسبة لشركة شل بورن:

sh myscript.sh

للباش:

bash myscript.sh
15
anon

إذا كنت تريد تشغيل البرنامج النصي في Shell الحالي (على سبيل المثال ، تريد أن تكون قادرة على التأثير على الدليل أو البيئة) ، يجب أن تقول:

. /path/to/script.sh

أو

source /path/to/script.sh

لاحظ أن /path/to/script.sh يمكن أن يكون نسبيًا ، على سبيل المثال . bin/script.sh يعمل على script.sh في دليل bin ضمن الدليل الحالي.

10
Chas. Owens

يتم تعيين ملحق الملف .command إلى Terminal.app. النقر المزدوج على أي ملف .command سيتم تنفيذه.

0
benwiggy

أولاً ، إعطاء إذن للتنفيذ: -
chmod +x script_name

  1. إذا كان البرنامج النصي غير قابل للتنفيذ: -
    لتشغيل ملف البرنامج النصي sh: -
    sh script_name
    لتشغيل ملف البرنامج النصي bash: -
    bash script_name
  2. إذا كان النص قابل للتنفيذ: -
    ./script_name

NOTE: - يمكنك التحقق مما إذا كان الملف قابل للتنفيذ أم لا باستخدام 'ls -a'

0
Vineet Jain