Wyszukiwanie w witrynie

Poznaj różnicę między pozyskiwaniem a rozwidlaniem w Bash


Głównym celem tego artykułu jest jasne zrozumienie, co się stanie, gdy uruchomisz skrypt zamiast źródła skryptu w bashu. Po pierwsze, jasno zrozumiemy, w jaki sposób program jest przesyłany, gdy wywołasz skrypt na różne sposoby.

UWAGA: utworzenie skryptu z rozszerzeniem nie ma znaczenia. Skrypt będzie działał poprawnie nawet bez rozszerzeń.

Zasadniczo każdy skrypt zaczyna się od linii zwanej shebang(#!). Symbol Hash w bash będzie interpretowany jako komentarz, ale shebang ma specjalne znaczenie. Mówi bashowi, aby wysłał program w dowolnym interpreterze, o którym wspomniałeś w shebang.

Poniżej znajduje się przykładowy program, a ja określam bash jako mój interpreter.

cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

chmod +x Hello_world.sh

Teraz, aby uruchomić skrypt, możesz to zrobić na dwa sposoby.

  • Użyj ścieżki względnej, aby wywołać skrypt. Przejdź do katalogu, w którym znajduje się skrypt i uruchom ./Hello_world.sh.
  • Użyj ścieżki bezwzględnej, aby wywołać skrypt. Z dowolnego miejsca w systemie plików wpisz pełną ścieżkę do skryptu.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Zobaczmy teraz, co się stanie, gdy spróbujesz przesłać swój program bez shebang. W przypadku braku shebang program zostanie przesłany do dowolnej powłoki, z której aktualnie korzystasz. W moim przypadku jest to Bash (/bin/bash).

Pozwólcie, że zademonstruję przykład. Tworzę skrypt Pythona bez shebang i kiedy wywołuję program, bash nie wie, że powinien przesłać ten program do interpretera Pythona, zamiast tego uruchomi program w obecnej skorupie.

cat > run-py.py
echo $SHELL
print("Hello world")

chmod +x run-py.py
./run-py.py

W takim przypadku możesz wywołać program, podając, do którego interpretera ma zostać przesłany, lub po prostu dodać linię shebang, co jest zawsze zalecane.

which python3
$(which python3) /home/karthick/run_py.py

Teraz, gdy wiesz, jak wywołać skrypt, następnym krokiem będzie zrozumienie, co się stanie, gdy wywołamy skrypt. Kiedy wywołasz skrypt, jak pokazano w powyższych przykładach, utworzy on proces potomny (fork), a skrypt zostanie przesłany do procesu potomnego. Uruchomiłem przykładowy skrypt, który po prostu uruchomi następujące polecenie i pokaże, że skrypt został przesłany do procesu potomnego.

ps -ef --forest | grep -i bash

W ramach skryptu może istnieć wiele procesów potomnych, a to zależy od naszego kodu. Należy zauważyć, że zmienne środowiskowe utworzone przez indeks dolny zostaną usunięte po zakończeniu. Proces potomny może uzyskać dostęp do zmiennych utworzonych przez proces nadrzędny poprzez ich eksport. Jednak proces nadrzędny nie może uzyskać dostępu do zmiennych utworzonych przez proces potomny.

Zapoznaj się z poniższymi artykułami, aby dowiedzieć się więcej o działaniu zmiennych i sposobie ich eksportowania.

  • Zrozumienie i pisanie „zmiennych linuksowych” w skryptach powłoki
  • Poznaj różnicę między $$i $BASHPID w Bash

Pozyskiwanie skryptu

Źródło” to wbudowane polecenie powłoki, które odczytuje plik przekazany mu jako argument i uruchamia kod w bieżącym środowisku powłoki. Odpowiednim przypadkiem użycia, którego najczęściej używasz, jest modyfikacja konfiguracji w .bashrc lub .bash_profile i ponowne załadowanie zmian za pomocą polecenie source.

type -a source

Istnieją dwa syntaktyczne sposoby uruchomienia polecenie source. Możesz wybrać dowolną z dwóch składni i jest to wybór osobisty.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Pozwólcie, że zademonstruję, jak faktycznie działa źródło. Zamierzam utworzyć dwa skrypty powłoki. Pierwszy skrypt (Module.sh) będzie przechowywać pewne zmienne i funkcje. Drugi skrypt (Main.sh) wypisze zmienną i wywoła funkcję.

Plik Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

Plik Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Ustaw uprawnienia do wykonywania skryptu i wywołaj główny skrypt „main.sh ”. Teraz ten skrypt spróbuje znaleźć funkcję f1 i zmienną VAR1 w bieżącym środowisku powłoki, ale zakończy się niepowodzeniem, ponieważ nie znaleziono polecenia.

bash main.sh

Teraz uruchommy w skrypcie polecenie source, które załaduje zmienną i funkcje do bieżącego środowiska powłoki i będzie dostępne przez „main.sh ”.

Plik Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

Plik Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Teraz uruchom skrypt ponownie i zobacz.

bash main.sh

Źródło jest bardzo przydatne w bash, aby zastosować modułowe podejście programistyczne podczas tworzenia naszych skryptów powłoki. Możemy podzielić nasz kod na mniejsze moduły i można go wykorzystać w wielu programach. W ten sposób możemy postępować zgodnie z zasadą DRY (Nie powtarzaj się).

To wszystko w tym artykule. Pokrótce omówiliśmy różnicę między sourcingiem a forkowaniem w bashu. Zapoznaj się z artykułem i podziel się z nami swoją cenną opinią.