В чем разница между запуском сценария bash с использованием sh и ./

Тот же вопрос может возникнуть при использовании любого типа скрипта, а не только bash. Есть ли большая разница между запуском скрипта через интерпретатор и его запуском напрямую?

Еще одна загадка, которую мы раскроем в этом интересном посте от Let's Use Linux (uL).


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

ш мискрипт.ш

Если вы запустите сценарий сам по себе, система вызовет необходимый ей интерпретатор, а затем, да, она выполнит сценарий, передав его в качестве аргумента интерпретатору, но все это автоматически и без ведома пользователя, выполнившего сценарий.

./myscript.sh

Чтобы скрипт запускался сам по себе, необходимо выполнение 2 условий:

1) сценарий должен включать «черту». Это первая строка скрипта, которая должна начинаться с символов #! и что вы должны указать путь, по которому находится интерпретатор. Важно отметить, что это условие верно для любого типа скрипта (python, perl и т. Д.), А не только для скриптов из bash.

Так, например, наш скрипт должен содержать в первой строке следующее:

#! / Bin / Баш

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 сказал

    Интересно то, что вы упомянули. Он называется двух форм: линия челки или прямая линия челки. Даю вам информацию: 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.   ЭМ ДИ ЭМ сказал

    Как интересно, я заявляю, что совершенно не разбираюсь в программировании и во всем, что связано со сценарием, я понятия не имел, как это работает, но я заметил, что у некоторых есть этот заголовок.

  14.   Марио Раймонди сказал

    Случившееся со мной разъяснение, связанное с этой записью: я хотел установить гаджет Adobe Air (калькулятор шансов в покере). Программа установки Adobe Air запускает соответствующий сценарий с «su», но в форме ./, запрашивая у вас пароль root. Поскольку у сценария не было разрешений на выполнение, он отказал в разрешении, решение: запустите сценарий с помощью sh, если вы не хотите изменять разрешения (быстрее, чем переход в папку tmp chmod и все такое). Там скрипт исполняется, вызывает инсталлятор самана и еще одну штуку бабочки.

  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, но укажете #! / Bin / sh shebang, ваш сценарий, вероятно, будет работать в 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» (это только пример, но это 2 случая, о которых я могу думать) и в случае способности иногда он просит меня ввести «yon» или в «su» он запрашивает у меня пароль ... Я бы хотел, чтобы сценарий выбрал эти параметры автоматически, либо передав параметр, либо используя какой-либо метод, о котором он не знает .... Спасибо за внимание

    1.    давайте использовать Linux сказал

      Привет, Антонио! Если ваша проблема связана с вводом пароля, я не думаю, что есть решение. Именно потому, что это мера безопасности, чтобы не каждый мог установить программу.
      Что касается способностей и необходимости поставить да, я думаю, это решаемо. На данный момент я не помню точный параметр, который нужно использовать, но просто узнайте на страницах руководства. Откройте терминал и введите команду: man aptitude.
      Объятие! Павел.

  19.   Дэвид ММ сказал

    Очень хороший пост.
    В этом посте мне особенно понравилось, что на возникающие вопросы / сомнения даны очень четкие и лаконичные ответы.