У чому різниця між запуском скрипта bash за допомогою sh та ./

Це саме питання може виникнути під час використання скриптів будь-якого типу, не тільки bash. Чи існує велика різниця між запуском сценарію через інтерпретатор та його безпосереднім запуском?

Ще одна загадка, яку ми розкриємо в цій цікавій публікації від «Використовуймо Linux (uL)».


Коли ви запускаєте сценарій, передаючи ім'я файлу сценарію інтерпретатору (sh, python, perl тощо), ви фактично виконуєте інтерпретатор, передаючи програму, яку ви хочете виконати як аргумент. Наприклад, ми запускаємо інтерпретатор sh, передаючи йому аргумент miscript.sh.

sh misscript.sh

Якщо ви запустите сценарій самостійно, система викличе потрібний інтерпретатор, і тоді, так, вона виконає скрипт, передаючи його як аргумент інтерпретатору, але все автоматично і без знання користувача, який виконав скрипт.

./myscript.sh

Для того, щоб запускати сценарій самостійно, необхідно виконати 2 умови:

1) сценарій повинен містити "рядок вибуху". Це перший рядок сценарію, який повинен починатися з символів #! і що ви повинні вказати шлях, де знаходиться інтерпретатор. Важливо зазначити, що ця умова справедлива для будь-якого типу сценарію (python, perl тощо), а не лише для bash.

Так, наприклад, наш скрипт повинен містити наступне як перший рядок:

#! / бін / баш

2) файл повинен мати дозволи на виконання:

Щоб надати дозвіл на виконання нашого сценарію, ми повинні написати:

chmod a + x miscript.sh

Готово, тепер просто запустіть його так:

./myscript.sh

Або скопіювавши сценарій у "спеціальний" шлях, який дозволяє легко викликати його. Наприклад, ми можемо скопіювати його в / usr / sbin і запустити з будь-якого місця, не включаючи повний шлях, де він знаходиться:

Копіюємо:

sudo cp miscript.sh / usr / sbin / miscript

Ми виконуємо:

помилка

Як бачите, насправді те, що відбувається за лаштунками, дуже схоже в обох випадках. Однак, включивши "рядок вибуху", ваші сценарії буде набагато легше розповсюджувати, оскільки користувачам не доведеться запам'ятовувати шлях, де знаходяться необхідні інтерпретатори, щоб мати можливість їх виконувати. Висновок: це в основному питання комфорту.


Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   Освальдо Вільярроель - сказав він

    Я згоден з вами, Erpower, і версія інтерпретатора, і його шлях є змінними, а не постійними, тим більше, якщо вважати, що дистрибутиви GNU / Linux не єдині, які використовують Bash (є також: freeBSD, OpenSolaris, Mac) і багато з них мають різні конфігурації або маршрути.

    Важливо знати, що ви маєте гнучкість (як ви вже добре згадали), щоб грати із викликом сценарію, або ./, або з sh (або python ... тощо)

  2.   he_who_knows@gmail.com - сказав він

    Bash - це комп'ютерна програма, функцією якої є інтерпретація замовлень.

    Він базується на оболонці Unix і відповідає POSIX.

    натомість sh - це комп'ютерна програма, функцією якої є інтерпретація замовлень.
    Включає такі функції, як управління процесом, переспрямування
    введення / виведення, перелік і читання файлів, захист,
    комунікації та мова команд для написання програм
    пакети або сценарії. Це був інтерпретатор, який використовувався в перших версіях Unix, і він став фактичним стандартом.

  3.   Діана С - сказав він

    Привіт, я новачок у використанні сценаріїв, і я хотів би знати, чи може хтось допомогти мені у вирішенні моєї проблеми:

    Я керую програмою, яка вимагає включення кількох початкових даних через консоль, і я з’ясував, що за допомогою сценарію можна виконати програму з початковими даними, щоб не довелося писати її знову і знову, коли мені потрібно запустити програму.

    Я не знаю, як це зробити, тому, якщо хтось може мені допомогти в цьому, я буду дуже вдячний.

  4.   Давайте використовувати Linux - сказав він

    Дивіться, це залежить від того, на якій мові програмування ви пишете сценарій. Однак у будь-якому випадку вам потрібно:

    1) Якщо ви хочете, щоб користувач повинен вводити ці дані щоразу, коли сценарій виконується, найпоширенішою процедурою є змінна, яка приймає значення, введені у введенні.

    2) Якщо значення завжди однакові, ви можете використовувати константи.

    3) Інший варіант - це можливість того, що ваш скрипт може приймати параметри.

    На здоров’я! Павло.

  5.   Давайте використовувати Linux - сказав він

    Цікаво те, що ви згадали. Його називають 2-ма формами: лінія шебанга або пряма лінія вибуху. Я даю вам інформацію: http://python.about.com/od/programmingglossary/g/defbangline.htm
    На здоров’я! Павло.

  6.   @llomellamomario - сказав він

    Цікаво, що я ніколи не зупинявся, думаючи про цю деталь. Було б цікаво побачити більше статей про ретушування консолі, серед них відома перекомпіляція ядра, щоб видалити непотрібні кілограми коду, які є лише для сумісності та покращення системної швидкості.

  7.   Давайте використовувати Linux - сказав він

    ДОБРЕ. Я буду це пам’ятати.
    На здоров’я! Павло.

  8.   Давайте використовувати Linux - сказав він

    Я радий, що це спрацювало. Я завжди намагаюся публікувати речі, які, на мій погляд, можуть бути цікавими та практичними.
    Обійми! Павло.

  9.   Фелікс Мануель Бріто Амаранте - сказав він

    Кожен програміст із хорошими звичками додає "рядок" у перший рядок коду. У Python я ніколи не забуваю кодування та рядок вибуху.
    #! / usr / bin / python2.7
    # *. * кодування = utf-8 *. *

  10.   diex02 - сказав він

    Чудово, сподіваємось, ви можете публікувати більше інформації про командний рядок, особливо коли мова йде про компіляцію або встановлення з вихідних файлів (tar.gz тощо)

  11.   Джо ді Кастро - сказав він

    Я ніколи не чув про "лінію вибуху", я завжди це знав як Шебанг

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    привіт

  12.   Джонатан Фернандес - сказав він

    цікава записка… дякую!

  13.   eM Скажи eM - сказав він

    Як цікаво, я оголошую себе абсолютно невігласом у програмуванні та в усьому, що пов’язано зі сценарієм, я навіть не уявляв, як це працює, але я помітив, що деякі мають такий заголовок.

  14.   Маріо Раймонді - сказав він

    Пояснення, яке трапилось зі мною, пов’язане з цим постом: я хотів встановити повітряний пристрій Adobe (калькулятор шансів на покер). Що робить Adobe Air Installer - це запустити відповідний скрипт із "su", але у формі ./ з проханням ввести root-пароль. Оскільки сценарій не мав дозволів на виконання, він видав дозвіл відмовлено, рішення: запустіть скрипт з sh, якщо ви не хочете змінювати дозволи (швидше, ніж перехід до папки tmp chmod і все таке). Там скрипт виконується, він викликає установник Adobe і щось інше метелик.

  15.   Еро-Сеннін - сказав він

    Дуже цікава стаття! Дякуємо, що допомогли мені дізнатися трохи більше про консоль. Давайте подивимось, чи продовжуєте ви публікувати статті, подібні до цих ^^.
    Так продовжуйте, це, без сумніву, мій улюблений блог !!

  16.   Потужність - сказав він

    Майте на увазі, що між використовуваними версіями інтерпретатора можуть існувати відмінності. Запускаючи скрипт безпосередньо відповідно до shebang, неможливо вказати, яку версію інтерпретатора використовувати, що може знадобитися. Якщо замість цього запустити інтерпретатор і передати сценарій як параметр, ви знаєте, яка його версія запущена.

    Наприклад, у Python, якщо shebang #! / Usr / bin / python2.4, програма буде працювати інакше, ніж якщо це #! / Usr / bin / python2.6 або якщо це #! / Usr / bin / python (що зазвичай є символічним посиланням на версію Python, яка встановлена ​​та налаштована за замовчуванням). Це відбувається тому, що Python 2.6 має нову функціональність, яка не існувала в Python 2.4, тому написання сценарію, який використовує цю функцію із зазначенням #! / Usr / bin / python shebang, не вдасться, якщо в системі встановлено лише python 2.4. Натомість ви завжди можете змусити сценарій запускатись із потрібною версією python, запускаючи його з "python2.4 /path/al/script.py" або "python2.6 /path/al/script.py/

    Для сценаріїв оболонки також існують відмінності між оболонками, які ви використовуєте, тому використання #! / Bin / sh та #! / Bin / bash може мати різні результати залежно від сценарію. Якщо ви пишете сценарій з використанням функцій, які існують лише в bash, але вказують shebang #! / Bin / sh, ваш сценарій, ймовірно, буде працювати в Linux (у більшості дистрибутивів / bin / sh є символічним посиланням на bash), але він, мабуть, не вдасться в інших UNIX, де bash не встановлений або де / bin / sh не є символічним посиланням на / bin / bash.

    Крім того, що стосується переносимості, слід враховувати, що шлях, зазначений у shebang, є абсолютним, і бувають випадки, коли перекладачі встановлюються в інших місцях. Наприклад, зазвичай використовується перекладач python, встановлений у / usr / local / bin / python, якщо ви завантажили та скомпілювали Python замість того, щоб використовувати пакет із вашого дистрибутива. Якщо ваш шебанг #! / Usr / bin / python, сценарій не працюватиме в цих системах. Щоб спробувати уникнути цих проблем, ви можете використовувати як shebang "#! / Usr / bin / env python" (або "#! / Usr / bin / env sh"), як пояснено в http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Давайте використовувати Linux - сказав він

    Дякую Джонатану! Приємно бачити ваш коментар!
    На здоров’я! Павло.

  18.   антонио - сказав він

    Ніде не відбувається те, що я хочу знати, або, принаймні, я не знаю, як це підняти в пошуковій системі, я хочу створити сценарій, який з причини xX виконує команду aptitude або «su» (це лише приклад, але це два випадки, які я можу придумати), і у випадку схильності він іноді просить мене ввести "yon" або в "su" запитує пароль ... Я б хотів, щоб сценарій вибрав ці параметри автоматично або передаючи параметр, або використовуючи якийсь метод, якого він не знає .... Дякую за увагу

    1.    давайте використовувати linux - сказав він

      Привіт Антоніо! Якщо ваша проблема полягає у введенні пароля, я не думаю, що є рішення. Саме тому, що це міра безпеки, тому не кожен може встановити програму.
      Щодо здібностей та необхідності поставити так, я думаю, це можна вирішити. На даний момент я не пам’ятаю, який саме параметр використовувати, але просто з’ясуйте на сторінках керівництва. Відкрийте термінал і введіть команду: man aptitude.
      Обійми! Павло.

  19.   Девід М.М. - сказав він

    Дуже хороший пост.
    Мені особливо сподобалось - у цьому дописі - те, що на запитання / сумнів, що виникають, відповідають дуже чітко і стисло.