W Advanced Bash-Scripting Guide , w przykładzie 27-4 , 7-ta linia od dołu przeczytałem:
Funkcja działa jako podproces.
Zrobiłem test w Bash i wydaje się, że powyższe stwierdzenie jest błędne.
Wyszukiwania w tej witrynie, Bash Man i moja wyszukiwarka nie przynoszą żadnego światła.
Czy znasz odpowiedź i chciałbyś wyjaśnić?
Odpowiedzi:
Advanced Bash-Scripting Guide nie zawsze jest niezawodny, a jego przykładowe skrypty zawierają przestarzałe praktyki, takie jak używanie efektywnie przestarzałych odwrotności do podstawiania poleceń, tj.
`command`
Zamiast$(command)
.W tym konkretnym przypadku jest to rażąco niepoprawne.
Rozdział o funkcjach powłoki w (kanonicznym) podręczniku Bash definitywnie stwierdza, że
źródło
Funkcje nawiasów klamrowych będą działać w procesie powłoki wywołującej, chyba że potrzebują własnej podpowłoki, która jest:
&
Przekierowania lub dodatkowe środowisko zmienne nie wymuszą nowej podpowłoki:
Jeśli funkcja zostanie zdefiniowana za pomocą nawiasów zamiast curlies:
zawsze będzie działał w nowym procesie.
Podstawianie poleceń
$()
zawsze tworzy procesy w bash (ale nie w ksh, jeśli uruchamiasz wewnątrz niego wbudowane funkcje).źródło
f() (...)
jest dozwolone. Czy są jakieś inne definicje oprócz{...}
i(...)
? W Bash nie interesuję się jeszcze innymi.function hw { echo hello world; }
składni (nie musisz tego()
wpisywaćfunction
i możesz określić przekierowania zaraz po finale}
lub)
jak whw(){ echo error; } >&2
. To wszystkof()(...)
zawsze wykonuje własną powłokę, podczas gdyf(){...}
nie.foo() [[ x = x ]]
jest to również poprawna definicja funkcji. Jeśli jednak spojrzysz na funkcję za pomocątype foo
, zobaczysz, że jest to nadal cukier syntaktycznyfoo() { [[ x = x ]]; }
. To samo dotyczy funkcji podpowłoki:bar() ( : )
staje siębar() { ( : ); }
.Polecenie z tego przykładu wygląda następująco:
Przykład później stwierdza:
Będąc charytatywnymi dla ABS Guide, najwyraźniej zamierzali napisać, że funkcja działa wewnątrz podstawienia polecenia, a polecenie wewnątrz podstawienia polecenia działa w podpowłoce .
źródło