Czy `if` i` then` faktycznie programują


15

Przeczytałem, że średnik służy do oddzielania programów:

$ echo 3; ls -la

Czy to znaczy if, theni czy elsesą tu osobne programy?

$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi

To pytanie nie dotyczy średników.



1
@StephenRauch Niezupełnie duplikat. Co więcej, jest to rozsądny wynik z tego Q, jako próba dalszego zrozumienia.
user207673,

Więcej sformułowań programowych:[ $variable == abcdef ] && echo yes || echo no
Hagen von Eitzen,

2
@HagenvonEitzen, który nie jest ściśle równoważny, jeśli instrukcja w pierwszym oddziale zawiedzie, drugi również się wykona.
Morgen

Odpowiedzi:


26

Te ;wypowiedzi oddziela (luźno mówienia). Jest (prawie) zawsze możliwe zastąpienie ;znaku nowej linii.

Powiedzieć, że ;oddziela dwa programy, a zatem ifi thenmusi być „programy” jest trochę zbyt uproszczone jako oświadczenie może być wykonana ze słów zastrzeżonych, funkcji powłoki, wbudowany mediów i narzędzi zewnętrznych, oraz kombinacje tych rur używania i operatorów logicznych etc. . itp.

Zarówno ifi thensą zarezerwowane słowa gramatyki muszli , a nie „programy”. Tutaj służą do budowania tego, co technicznie nazywa się złożonym poleceniem .

echojest prawdopodobnie wbudowanym narzędziem w powłoce (ale nie musi tak być) i lsprawdopodobnie jest narzędziem zewnętrznym (lub „programem”, jak mówisz).


7

Chociaż jest to uczciwe pierwsze przybliżenie, kiedy zaczynasz uczyć się samych podstaw korzystania z powłok, na poziomie „tutaj jest sposób uruchamiania programu” i „tutaj jest to, jak uruchamia się wiele programów jeden po drugim w jednym wierszu” , to nie jest tak naprawdę prawda.

Trudniejsze do zrozumienia dla początkującego, ale bardziej poprawne jest to, że językiem powłoki jest język komputerowy . Ma składnię . Ta składnia obejmuje różne elementy leksykalne, w tym (między innymi) znaki nowej linii, operatory, słowa i słowa zastrzeżone.

if, then, else, I fizarezerwowane słowa . Mają one szczególne znaczenie podczas analizowania danych wejściowych przekazywanych powłoce, zgodnie z jej gramatyką . Podobnie ;jest operatorem separatora .

Dane wejściowe w języku powłoki są zatem, jako całość, programem komputerowym interpretowanym przez inny program, tłumacza , powłokę. Poszczególne części gramatyczne nie są programami. Język powłoki to sposób określania (innych) programów do uruchomienia powłoki.

[nie jest specjalnym elementem leksykalnym w gramatyce powłoki, takim jak operator. Jest to zwykłe słowo , które nazywa jeden taki program o nazwie [. Wiele powłok ma wbudowaną wersję tego programu, połączoną z kodem samego programu powłoki, ale można także znaleźć program zewnętrzny o tej nazwie, np. /bin/[Lub /usr/bin/[, który programy inne niż powłoki mogą wywoływać. Podobnie, ]nie jest też specjalnym elementem leksykalnym powłoki. To zwykłe słowo, które staje się argumentem dla [programu. [Program wymaga, że jej ostatni argument, gdy jest ona wykonywana, bądź ], który następnie przechodzi do zignorowania.

Innym podobnym programem wymienionym w twoim pytaniu jest echo. Ponownie, większość powłok ma wbudowaną wersję tego programu. Ale znowu jest też zewnętrzna wersja programu, taka jak /bin/echolub /usr/bin/echo, do wywoływania programów innych niż powłoki.

Trzeci program wymieniony w twoim pytaniu to ls. Powłoki na ogół nie mają wbudowanych wersji tego programu i jest to program zewnętrzny, który można znaleźć gdzieś np. /bin/lsLub /usr/bin/ls.

Więcej informacji na temat powłoki Bourne Again można znaleźć w Podstawowych funkcjach powłoki dokumentacji GNU Bourne Again. Inne skorupy mają naturalnie inną gramatykę. Specyfikacja Single Unix opisuje składnię, do której powinny stosować się wszystkie powłoki zgodne z POSIX (w ich trybach zgodnych z POSIX).

Dalsza lektura

  • Gramatyka powłoki ”. Język poleceń powłoki . Podstawowe specyfikacje Wydanie 7. Grupa otwarta. IEEE 1003.1-2008. ISBN 1937218812.
  • test. Użytkowe . Podstawowe specyfikacje Wydanie 7. Grupa otwarta. IEEE 1003.1-2008. ISBN 1937218812.
  • Gramatyka powłoki ”. Podręcznik Z Shell . wersja 5.3.1. 2017 r.

5

To nie jest rzeczywiście daleko idące myśleć if, theni elsejak programami zewnętrznymi. W rzeczywistości, Thompson shell w oryginalnym 1. edycji Unix wdrożone ifi gotojak programami zewnętrznymi. Jest to możliwe, ponieważ podproces współdzieli deskryptory plików z procesem powłoki, więc goto (do przodu) musiało po prostu czytać dane wejściowe, dopóki nie znajdzie etykiety docelowej, a następnie kończy działanie. Zobacz powłokę Thompson .


Lub rzeczywiście zobacz Laurent Bercot ifi ifelse, które są częścią execline. ifJednak nie o to chodzi.
JdeBP

2
„Właściwie nie jest zbyt daleko idące myśleć o tym, czy, wtedy i jeszcze jako o programach zewnętrznych”. No cóż, ponieważ nie są.
Lekkość ściga się z Moniką

2

thenI elsenie są programy. Pozostałe części są. Zauważ, że nie ma ;„bezpośrednio po nich”, ale po poleceniu, które poprzedzają.

[ ... ] Jest polecenie, a potrzebuje ;jeśli następuje początek innego polecenia.

AFAIK, wszystkie struktury kontrolne w Bash i prawdopodobnie większość powłok * nix, są takie same. Są to instrukcje dla tłumacza. Z drugiej strony test lub warunek wykorzystuje program / proces, który jest „wykonywany” i jest komendą. Ponieważ thenjest częścią wiersza prowadzącego do echopolecenia, musi być oddzielony nowym wierszem od poprzedniego polecenia [ ... ]. Nie trzeba go oddzielać od sterowanego polecenia, czyli echo yes.

Z prawnego punktu widzenia, choć brzydkie i trudne do odczytania, możesz to zrobić.

if [ $VARIABLE == abcdef ]
then echo yes
else echo no
fi

Zauważ, że nie ma tutaj potrzeby ;pomiędzy kontrolkami, nawet jeśli nie są na swojej linii.

Co ciekawe, cała struktura kontrolna ( if ... fi) jest poleceniem powłoki, a całość musi kończyć się nową linią lub znakiem a ;. Ostatnia linia nie może być, fi echo doneale musi być fi; echo done. To samo co przypisanie VARIABLE='abcdef'jest poleceniem.

Mimo że całe struktury sterujące są komendami, nadal nie są programami.


1

if, elif, then, I fisą wszystkie słowa zarezerwowane stosowane do realizacji jednego z konstruktami, o których mowa, jak polecenie związku w powłoce, co oznacza, że nie może być poleceniem (lub raczej inne polecenie) według któregokolwiek z tych nazw w powłoce. Ogólnie rzecz biorąc, celem ;nie jest rozdzielanie poleceń, ale zakończenie listy poleceń . Na przykład następująca poprawna ifinstrukcja:

if echo foo; echo bar; echo baz; then echo done; echo really done; fi

Warunkiem ifinstrukcji jest lista poleceń echo foo; echo bar; echo baz. Analizator składni wie, że warunek się skończył, ponieważ thenbezpośrednio po średniku nie może być poleceniem, ponieważ jest zastrzeżonym słowem kluczowym. W ten sposób wie, że tym, co następuje, then jest początek ciała. Podobnie fijest zastrzeżonym słowem kluczowym i dlatego nie może być trzecim poleceniem w treści ifinstrukcji, ale oznacza koniec polecenia złożonego.


dzięki, jeśli jest używany if program1 foo; program2 bar; program3 baz; , jaki powinien być status programu 0, aby powłoka przechodziła dalej then? Ostatni?
Maxim Koretskyi

Właśnie program3 baz. Status wyjścia z listy poleceń jest statusem wyjścia z ostatniego polecenia na tej liście. Pozostałe dwa mogą zawieść bez wpływu na stan.
chepner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.