Каква е разликата между стартирането на bash скрипт с помощта на sh и ./

Същият въпрос може да възникне при използване на всякакъв тип скриптове, не само на bash. Има ли съществена разлика между пускането на скрипт през интерпретатора и директното му стартиране?

Още една загадка, която ще разкрием в тази интересна публикация от Нека използваме Linux (uL).


Когато стартирате скрипт, като предадете името на файла на скрипта на интерпретатор (sh, python, perl и т.н.), вие всъщност изпълнявате интерпретатора, предавайки програмата, която искате да изпълните като аргумент. Например стартираме интерпретатора sh, като му предадем аргумента miscript.sh.

sh myscript.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 форми: линия shebang или директно взрив. Давам ви информацията: 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.   Джо ди Кастро каза той

    Никога не бях чувал за „взривна линия“, винаги съм го познавал като Shebang

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

    поздрави

  12.   Джонатан Фернандес каза той

    интересна бележка ... благодаря!

  13.   eM Кажете eM каза той

    Колко интересно, аз се обявявам за напълно невеж в програмирането и всичко, свързано със скрипта, нямах представа как работи, но забелязах, че някои имат тази заглавка.

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

    Пояснение, което ми се случи, което е свързано с този запис: Исках да инсталирам приспособление за кирпич (калкулатор на шансовете за покер). Това, което прави инсталаторът на adobe air, е да стартира съответния скрипт с "su", но във формата ./ с искане за корен парола. Тъй като скриптът нямаше разрешения за изпълнение, той хвърли отказано разрешение, решението: стартирайте скрипта с 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, вместо да използвате пакет от вашата дистрибуция. Ако вашият shebang е #! / Usr / bin / python, скриптът няма да работи на тези системи. За да се опитате да избегнете тези проблеми, можете да използвате като шебанг "#! / 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.   Дейвид ММ каза той

    Много добър пост.
    Особено ми хареса - в този пост - че на възникналия въпрос / съмнение се отговаря много ясно и кратко.