Jaka jest różnica między uruchomieniem skryptu basha przy użyciu sh i ./

To samo pytanie może pojawić się podczas używania dowolnego typu skryptów, nie tylko tych bash. Czy istnieje zasadnicza różnica między uruchomieniem skryptu przez interpreter a uruchomieniem go bezpośrednio?

Jeszcze jedna tajemnica, którą ujawnimy w tym interesującym poście z Let's Use Linux (uL).


Kiedy uruchamiasz skrypt, przekazując nazwę pliku skryptu do interpretera (sh, python, perl itp.), W rzeczywistości wykonujesz interpreter, przekazując program, który chcesz wykonać jako argument. Na przykład uruchamiamy interpreter sh, przekazując mu argument miscript.sh.

sh misscript.sh

Jeśli uruchomisz skrypt samodzielnie, system wywoła potrzebnego interpretera, a następnie tak, wykona skrypt przekazując go jako argument interpreterowi, ale wszystko to automatycznie i bez wiedzy użytkownika, który wykonał skrypt.

./myscript.sh

Aby sam uruchomić skrypt, muszą być spełnione 2 warunki:

1) skrypt musi zawierać „bang line”. To jest pierwsza linia skryptu, która musi zaczynać się od znaków #! i że musisz określić ścieżkę, w której znajduje się tłumacz. Należy zauważyć, że warunek ten jest prawdziwy dla każdego typu skryptów (python, perl itp.), A nie tylko tych z basha.

Na przykład nasz skrypt powinien zawierać jako pierwszą linię:

#! / bin / bash

2) plik musi mieć uprawnienia do wykonywania:

Aby nadać uprawnienia do wykonywania naszego skryptu, musimy napisać:

chmod a + x miscript.sh

Gotowe, teraz po prostu uruchom to w ten sposób:

./myscript.sh

Lub kopiując skrypt na „specjalną” ścieżkę, która umożliwia łatwe wywołanie. Na przykład możemy skopiować go do / usr / sbin i uruchomić z dowolnego miejsca bez podania pełnej ścieżki, w której się znajduje:

Kopiujemy:

sudo cp miscript.sh / usr / sbin / miscript

Wykonujemy:

błędny opis

Jak widać, w rzeczywistości to, co dzieje się za kulisami, jest bardzo podobne w obu przypadkach. Jednak dzięki dołączeniu „linii wybuchu” Twoje skrypty będą znacznie łatwiejsze do dystrybucji, ponieważ użytkownicy nie będą musieli pamiętać ścieżki, w której znajdują się niezbędne interpretery, aby móc je wykonać. Wniosek: jest to w zasadzie kwestia komfortu.


20 komentarzy, zostaw swoje

Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Oswaldo Villarroel powiedział

    Zgadzam się z tobą Erpower, zarówno wersja interpretera, jak i jego ścieżka są zmienne, a nie stałe, tym bardziej, jeśli weźmie się pod uwagę, że dystrybucje GNU / Linuksa nie są jedynymi, które używają Bash (są też: freeBSD, OpenSolaris, Mac) i wiele z nich mają różne konfiguracje lub trasy.

    Ważne jest, aby wiedzieć, że masz elastyczność (jak dobrze wspomniałeś), aby bawić się wywołaniem skryptu, albo z ./, albo z sh (lub pythonem ... itd.)

  2.   on_kto_wie@gmail.com powiedział

    Bash to program komputerowy, którego funkcją jest interpretacja poleceń.

    Opiera się na powłoce Unix i jest zgodny z POSIX.

    z drugiej strony sh jest programem komputerowym, którego funkcją jest interpretacja rozkazów.
    Zawiera funkcje, takie jak kontrola procesu, przekierowanie
    wejście / wyjście, lista plików i odczyt, ochrona,
    komunikacja i język poleceń do pisania programów według
    partie lub skrypty. Był to interpreter używany w pierwszych wersjach Uniksa i stał się de facto standardem.

  3.   Diana C. powiedział

    Witam, jestem początkującym w obsłudze skryptów i chciałbym wiedzieć czy ktoś może mi pomóc z problemem jaki mam:

    Zarządzam programem, który wymaga włączenia kilku danych początkowych przez konsolę i dowiedziałem się, że za pomocą skryptu można uruchomić program z danymi początkowymi, aby nie musieć ich ciągle pisać, kiedy muszę wykonać program.

    Nie wiem, jak to zrobić, więc jeśli ktoś może mi w tym pomóc, będę bardzo wdzięczny.

  4.   Użyjmy Linuksa powiedział

    Widzisz, to zależy od języka programowania, w którym piszesz skrypt. Jednak w każdym przypadku potrzebujesz:

    1) Jeśli chcesz, aby użytkownik musiał wprowadzać te dane za każdym razem, gdy wykonywany jest skrypt, najczęstszą procedurą jest przyjmowanie przez zmienną wartości wprowadzonych na wejściu.

    2) Jeśli wartości są zawsze takie same, możesz użyć stałych.

    3) Inną opcją jest możliwość, że twój skrypt może przyjmować parametry.

    Twoje zdrowie! Paweł.

  5.   Użyjmy Linuksa powiedział

    Ciekawe, o czym wspominasz. Nazywa się to na dwa sposoby: linia shebang lub linia bezpośrednio huk. Przekazuję Ci dane: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Twoje zdrowie! Paweł.

  6.   @lmellamomario. powiedział

    Co ciekawe, nigdy nie przestałem myśleć o tym szczególe. Ciekawie byłoby zobaczyć więcej artykułów o majsterkowaniu w konsolach, wśród nich słynna rekompilacja jądra w celu usunięcia kilogramów niepotrzebnego kodu, który jest dostępny tylko dla kompatybilności i poprawy szybkości systemu.

  7.   Użyjmy Linuksa powiedział

    W PORZĄDKU. Zapamiętam to.
    Twoje zdrowie! Paweł.

  8.   Użyjmy Linuksa powiedział

    Cieszę się, że zadziałało. Zawsze staram się publikować rzeczy, które moim zdaniem mogą być interesujące i praktyczne.
    Uścisk! Paweł.

  9.   Felix Manuel Brito Amarante powiedział

    Każdy programista z dobrymi nawykami dodaje „bang line” do pierwszej linii kodu. W Pythonie nigdy nie zapominam o kodowaniu i huku.
    #! / usr / bin / python 2.7
    # *. * encoding = utf-8 *. *

  10.   diex02 powiedział

    Świetnie, mam nadzieję, że możesz publikować więcej informacji na temat wiersza poleceń, zwłaszcza jeśli chodzi o kompilację lub instalację z plików źródłowych (tar.gz itp.)

  11.   Joe di castro powiedział

    Nigdy nie słyszałem o „bang line”, zawsze znałem go jako Shebang

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

    pozdrowienia

  12.   Jonathan Fernandez powiedział

    ciekawa uwaga… dziękuję!

  13.   eM Powiedz eM powiedział

    Co ciekawe, stwierdzam, że jestem kompletnym ignorantem w zakresie programowania i wszystkiego, co dotyczy skryptu, nie miałem pojęcia, jak to działa, ale zauważyłem, że niektórzy mają ten nagłówek.

  14.   Mario raimondi powiedział

    Wyjaśnienie, które mi się przydarzyło, związane z tym wpisem: Chciałem zainstalować gadżet Adobe Air (kalkulator szans pokerowych). Instalator Adobe Air uruchamia odpowiedni skrypt z "su", ale w postaci ./ z pytaniem o hasło roota. Ponieważ skrypt nie miał uprawnień do wykonywania, wyrzucił odmowę uprawnień, rozwiązanie: uruchom skrypt z sh, jeśli nie chcesz zmieniać uprawnień (szybciej niż przejście do folderu tmp chmod i tak dalej). Tam skrypt uruchamia się, wywołuje instalator Adobe i coś innego motyla.

  15.   ero-sennin powiedział

    Bardzo ciekawy artykuł! Dziękuję, że pomogłeś mi dowiedzieć się czegoś więcej o konsoli. Zobaczmy, czy nadal będziesz publikować takie artykuły ^^.
    Tak trzymaj, to bez wątpienia mój ulubiony blog !!

  16.   erpower , , , , , , , , , ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, , powiedział

    Pamiętaj, że mogą występować różnice między wersjami używanego tłumacza. Uruchamiając skrypt bezpośrednio zgodnie z shebangiem nie ma możliwości wskazania, której wersji interpretera użyć, która może być konieczna. Jeśli zamiast tego uruchomisz interpreter i przekażesz skrypt jako parametr, wiesz, która wersja jest uruchomiona.

    Na przykład w Pythonie, jeśli shebang to #! / Usr / bin / python2.4 program będzie działał inaczej niż jeśli jest to #! / Usr / bin / python2.6 lub jeśli jest to #! / Usr / bin / python (co jest zwykle dowiązaniem symbolicznym do wersji Pythona, która jest instalowana i konfigurowana domyślnie). Dzieje się tak, ponieważ Python 2.6 ma nową funkcjonalność, która nie istniała w Pythonie 2.4, więc napisanie skryptu, który używa tej funkcji, wskazując #! / Usr / bin / python shebang, zakończy się niepowodzeniem, jeśli system ma zainstalowany tylko Python 2.4. Zamiast tego zawsze możesz wymusić uruchomienie skryptu z wybraną wersją języka Python, rozpoczynając go od „python2.4 /path/al/script.py” lub „python2.6 /path/al/script.py/

    W przypadku skryptów powłoki istnieją również różnice między używanymi powłokami, więc użycie #! / Bin / sh i #! / Bin / bash może mieć różne wyniki w zależności od skryptu. Jeśli napiszesz skrypt używając funkcji, które istnieją tylko w bash, ale wskażesz shebang #! / Bin / sh, twój skrypt prawdopodobnie będzie działał na Linuksie (w większości dystrybucji / bin / sh jest symbolicznym dowiązaniem do basha), ale prawdopodobnie się nie powiedzie w innych UNIXach, w których bash nie jest zainstalowany lub gdzie / bin / sh nie jest dowiązaniem symbolicznym do / bin / bash.

    Również w przypadku przenośności należy wziąć pod uwagę, że ścieżka wskazana w shebang jest bezwzględna i zdarza się, że tłumacze są zainstalowani w innych miejscach. Na przykład często instaluje się interpreter Pythona w / usr / local / bin / python, jeśli pobrałeś i skompilowałeś Pythona zamiast używać pakietu z Twojej dystrybucji. Jeśli twój shebang to #! / Usr / bin / python, skrypt nie będzie działał na tych systemach. Aby spróbować uniknąć tych problemów, możesz użyć ashebang „#! / Usr / bin / env python” (lub „#! / Usr / bin / env sh”), jak wyjaśniono w http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Użyjmy Linuksa powiedział

    Dzięki Jonathan! Dobrze cię widzieć komentarz!
    Twoje zdrowie! Paweł.

  18.   antonio powiedział

    Nigdzie to, co chcę wiedzieć, a przynajmniej nie wiem, jak to podnieść w wyszukiwarce, nie chcę stworzyć skryptu, który z jakiegoś powodu xX wykonuje polecenie aptitude lub «su» (to tylko przykład ale są to 2 przypadki, które przychodzą mi na myśl) iw przypadku umiejętności czasami prosi mnie o wpisanie "yon" lub w "su" pyta mnie o hasło ... Chciałbym, aby skrypt wybrał te opcje automatycznie przez przekazanie parametru lub użycie metody, której nie zna .... Dziękuję za uwagę

    1.    użyjmy Linuksa powiedział

      Cześć Antonio! Jeśli Twoim problemem jest wpisanie hasła, nie sądzę, aby było rozwiązanie. Właśnie dlatego, że jest to środek bezpieczeństwa, więc nie każdy może zainstalować program.
      Jeśli chodzi o umiejętności i konieczność wyrażenia tak, myślę, że można to rozwiązać. Nie pamiętam w tej chwili dokładnego parametru, którego należy użyć, ale po prostu dowiedziałem się na stronach podręcznika. Otwórz terminal i wprowadź polecenie: man aptitude.
      Przytulić! Paweł.

  19.   Dawida MM powiedział

    Bardzo dobry post.
    Szczególnie podobało mi się - w tym poście - że na pytanie / wątpliwość, która się pojawia, odpowiada się bardzo jasno i zwięźle.