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

سئل على ٩ أبريل ٢٠٠٩  ·  تمت مشاهدة 900.1k مرة  ·  مصدر

P-A picture
في ٩ أبريل ٢٠٠٩

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

الإجابات

lhunath picture
في ٩ أبريل ٢٠٠٩
973

لتشغيل برنامج نصي sh غير قابل للتنفيذ ، استخدم:

sh myscript

لتشغيل برنامج نصي bash غير قابل للتنفيذ ، استخدم:

bash myscript

لبدء ملف تنفيذي (وهو أي ملف بإذن قابل للتنفيذ) ؛ أنت فقط تحدده من خلال مساره:

/foo/bar
/bin/bar
./bar

لجعل البرنامج النصي قابلاً للتنفيذ ، امنحه الإذن اللازم:

chmod +x bar
./bar

عندما يكون الملف قابلاً للتنفيذ ، فإن النواة مسؤولة عن معرفة كيفية إخراجها. بالنسبة للثنائيات غير ، يتم ذلك من خلال النظر إلى السطر الأول من الملف. يجب أن يحتوي على hashbang :

#! /usr/bin/env bash

يخبر hashbang النواة بالبرنامج المطلوب تشغيله (في هذه الحالة يتم تشغيل الأمر /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

لن يقوم kernel (قد يقوم البعض) بإجراء بحث عن PATH نيابة عنك. هناك برنامج يمكنه إجراء بحث عنك PATH ، على الرغم من أنه يسمى env . لحسن الحظ ، تحتوي جميع الأنظمة تقريبًا على برنامج env مثبت في /usr/bin . لذلك بدأنا env باستخدام مسار مشفر ، والذي يقوم بعد ذلك ببحث PATH عن bash وتشغيله حتى يتمكن من تفسير البرنامج النصي الخاص بك:

#!/usr/bin/env bash

هذا النهج له جانب سلبي واحد: وفقًا لـ POSIX ، يمكن أن يكون لـ hashbang حجة واحدة . في هذه الحالة ، نستخدم bash كوسيطة لبرنامج env . هذا يعني أنه ليس لدينا مساحة متبقية لتمرير الوسائط إلى bash . لذلك لا توجد طريقة لتحويل شيء مثل #!/bin/bash -exu إلى هذا المخطط. سيتعين عليك وضع set -exu بعد التجزئة بدلاً من ذلك.

هذا النهج أيضًا له ميزة أخرى: قد يتم شحن بعض الأنظمة بـ /bin/bash ، لكن المستخدم قد لا يعجبه ، قد يجد أنه قديم أو قديم ، وربما قام بتثبيت bash مكان آخر. هذا هو الحال غالبًا في OS X (Macs) حيث تقوم Apple بشحن /bin/bash قديمًا ويقوم المستخدمون بتثبيت /usr/local/bin/bash محدث باستخدام شيء مثل Homebrew. عند استخدام أسلوب env الذي يقوم ببحث PATH ، فإنك تأخذ تفضيل المستخدم في الاعتبار وتستخدم bash المفضل لديه على النظام الذي يشحنه نظامه.

P-A picture
في ٩ أبريل ٢٠٠٩
84

لبدء البرنامج النصي "file.sh":

sh file.sh

bash file.sh

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

chmod +x file.sh

الآن قم بتشغيل ملف .sh على النحو التالي:

./file.sh
anon picture
في ٩ أبريل ٢٠٠٩
17

لقشرة بورن:

sh myscript.sh

لباش:

bash myscript.sh
Chas. Owens picture
في ٩ أبريل ٢٠٠٩
10

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

. /path/to/script.sh

أو

source /path/to/script.sh

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

Vineet Jain picture
في ٢٥ أغسطس ٢٠١٧
0

أولاً ، امنح الإذن بالتنفيذ: -
chmod +x script_name

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

ملاحظة : - يمكنك التحقق مما إذا كان الملف قابلاً للتنفيذ أم لا باستخدام "ls -a"

benwiggy picture
في ٢ مارس ٢٠١٨
0

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

NVRM picture
في ٥ سبتمبر ٢٠١٩
0

إضافة قليلة ، لتشغيل مترجم من نفس المجلد ، لا تزال تستخدم #! hashbang في البرامج النصية.

كمثال ، يوجد ملف تنفيذي php7.2 تم نسخه من / usr / bin في مجلد على طول البرنامج النصي hello .

#!./php7.2
<?php

echo "Hello!"; 

لتشغيله:

./hello

التي تتصرف مثل:

./php7.2 hello

يمكن أن تكون الحلول المناسبة مع التوثيق الجيد هي أدوات linuxdeploy و / أو appimage ، وهذا باستخدام هذه الطريقة تحت الغطاء.