Różnica między poleceniami w skrypcie bash a poleceniami w terminalu

13

Czy są jakieś różnice między poleceniami wpisywanymi w terminalu a poleceniami, które dołączasz do skryptu?

jth41
źródło
Absolutnie nie głupie pytanie! Sprawdź to (najpierw), potem to i to .
Emanuel Berg,

Odpowiedzi:

7

Twój terminal uruchamia powłokę (najprawdopodobniej bash), która prosi o twoje polecenia i je uruchamia.

Oprócz tego trybu interaktywnego możesz także używać powłoki do uruchamiania poleceń z pliku. Aby wykonać polecenia z pliku, możesz albo wywołać powłokę bezpośrednio jak bash scriptlub możesz uruchomić plik z „shebang” #!/bin/bashi ustawić go jako wykonywalny ( chmod +x script). Następnie możesz traktować skrypt jak plik binarny i wykonać go na przykład jako ./scriptlub umieścić w miejscu, w którym szuka go powłoka. ( echo $PATH)

Najprawdopodobniej jest to zarówno twoja interaktywna powłoka, jak i powłoka użyta do uruchomienia bash. Z perspektywy „pierwszego dnia nauki linux” bash działa dokładnie tak samo w obu trybach. - Dużo później możesz się natknąć na niewielkie różnice. Jeśli naprawdę chcesz wiedzieć o szczegółach, sugerowałbym przeczytanie man bashi poszukiwanie miejsc wspominających o „interaktywnym”. (Możesz przeszukać stronę podręcznika, naciskając /.)

Należy zauważyć, że skrypt jest uruchamiany jako nowy proces. Oznacza to w szczególności, że zmienne ustawione w skrypcie nie są widoczne w powłoce wywołującej.

$ export a=1
$ echo $a
1
$ bash -c 'echo $a;a=2;echo $a' # change the value in a script
1
2
$ echo $a # value not changed here
1
$ 

Bez eksportu anie jest nawet widoczny dla wewnętrznego skryptu.

michas
źródło
1

Ogólnie odpowiedź brzmiałaby „nie”, polecenia w powłoce są takie same w skryptach, w składni i semantyce.

Istnieje jednak kilka drobnych niuansów związanych z konfiguracją środowiska (jakie zmienne są używane i jakie są ustawione).

  • interaktywna powłoka z wyboru dla Linuksa bash, ale skryptowym często używa innych tłumaczy ( sh, który jest poprzednikiem bash, ksh, który jest na równi z bash), więc trzeba wziąć pod uwagę to, co powłoka jest używany (nazwa bieżącej powłoki s tradycyjnie odbywa się w zmiennej SHELL, spróbuj pisać echo $SHELL).

  • mogą występować różnice w konfiguracji tego samego interpretera dla sesji interaktywnej i wykonywania skryptu.

Dmytro Sirenko
źródło
-1

Nie. Skrypt to lista poleceń, które można wpisać w terminalu.

Możesz wkleić całość skryptu w terminalu, a wynik będzie taki sam, jak uruchomienie go.

Odwrotnie, możesz „zapisać” polecenia terminala w pliku i przekształcić go w skrypt wielokrotnego użytku i udostępnić go rodzinie i znajomym.

Mathieu J.
źródło
4
Nie. Wklejanie zawartości jest równoznaczne z pozyskiwaniem skryptu. Spowoduje to zmianę wszelkiego rodzaju opcji w bieżącej powłoce, których nie zmieniłoby po prostu uruchomienie skryptu.
michas,
masz rację. ale jeśli chodzi o jego pytania. Myślę, że możemy powiedzieć, że jest dość podobny. ale tak, aby przetłumaczyć to, co powiedział michas w kategoriach noob'er. wklejenie zawartości skryptu jest równoważne source script_file. które będą edytować zmienne ENV w bieżącym kontekście. podczas uruchamiania skryptu, ponieważ ./script_filenie zmodyfikuje ENV, chyba że exportzostanie użyty jawnie.
Mathieu J.,
1
Nie. Nawet przy exporttym skrypt nie może modyfikować żadnych zmiennych powłoki wywołującej. To samo dotyczy rzeczy takich jak PWD, zdefiniowane aliasy, funkcje i tego typu rzeczy. Można je zmienić tylko interaktywnie lub poprzez pobranie pliku. Ale tak, to chyba nic, z kim ktoś się potknie pierwszego dnia. :)
michas
1
@michas: Cóż, nadal lepiej jest podać poprawny opis. Jeśli początkujący jest ambitny i ma nawyki pracy, szybko odbierze. Jeśli spróbujemy opowiedzieć dziecku bajkę, potkniemy się na nogach i zrobimy niezrozumiałe wrażenie - poza tym początkujący może wrócić. Chociaż nie uważam się za początkującego, jest wiele rzeczy, których nie wiem i byłbym obrażony, gdyby ktokolwiek powstrzymał się od odpowiedzi na moje pytania, ponieważ „jeszcze cię nie ma, młodszy”.
Emanuel Berg,