2013-02-01 21 views
7

Ten skrypt demonstruje definiowanie funkcji basha za pomocą nawiasów z nawiasami. Nawias ma ładny wpływ na tworzenie zmiennych środowiskowych utworzonych w funkcji "local", domyślnie , ponieważ treść funkcji jest wykonywana jako pod-powłokę. Dane wyjściowe to:Definiowanie bryły funkcji bash za pomocą nawiasów zamiast nawiasów klamrowych

A=something 
A= 
B=something 
B=something 

Pytanie brzmi, czy jest to dozwolona składnia do definiowania funkcji.

#!/bin/bash 

foo() (
    export A=something 
    echo A=$A 
) 

bar() { 
    export B=something 
    echo B=$B 
} 

foo 
echo A=$A 
bar 
echo B=$B 
+0

złe przypuszczenie. Te zmienne wydają się być lokalne, ponieważ to polecenie [komenda złożona] (http://wiki.bash-hackers.org/syntax/basicgrammar#compound_commands) jest wykonywane w oddzielnej grupie (kontekście), a NIE w podpowłoce !! – Florian

+0

@Florian Bash i POSIX nazywają to "środowiskiem podpowłoki", może to właśnie miał na myśli. Ale prawda: nie nowy proces. –

Odpowiedz

7

Tak, ta składnia jest dozwolona. Jak opisano w bash man page definicja funkcji bash:

[ function ] name() compound-command [redirection] 

Niektóre bardziej opisu (także ze strony człowieka)

Ciało funkcji jest polecenie związek compound-command. To polecenie jest zwykle listą poleceń pomiędzy { i }, ale może być dowolną komendą wymienioną pod Kombinacjami poleceń powyżej.

() i {} załączone listy to złożone polecenia. Pełna lista (ponownie ze strony człowieka, tylko edited do prostej listy):

Komenda związek jest jedną z następujących czynności:

(list) 
{ list; } 
((expression)) 
[[expression]] 
for name [ in word ] ; do list ; done 
for ((expr1 ; expr2 ; expr3)) ; do list ; done 
select name [ in word ] ; do list ; done 
case word in [ [(] pattern [ | pattern ] ...) list ;; ] ... esac 
if list; then list; [ elif list; then list; ] ... [ else list; ] fi 
while list; do list; done 
until list; do list; done 
+0

Dzięki za to. Zauważam, że to się nie udaje: foo() (eksport A = coś, echo A = $ A) bar() {eksport B = coś; echo B = $ B} Działa to: foo() (eksportuj A = coś, echo A = $ A;) bar() {eksportuj B = coś; echo B = $ B; } Tak samo robi się: (echo Cześć, echo Cześć) – ELO

+1

Przepraszam, nie jestem pewien, czy rozumiem - czy pytasz coś o średniki? –

+0

Umysł dmuchany, dzięki! –

1

Oba są ważne i jak Carl wspomniane każde polecenie związek mogą być również użyte, np

$ f() if [ "$1" = 'a' ]; then echo 'equals a'; fi 
$ f a 
equals a 
$ f b 
$ 

POSIX 7 2.9.5 Definicja funkcji poleceńhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05:

Format polecenia funkcja definiuje się następująco:

nazwap() związek sterowania, ... [io przekierowanie]

[...] Związek argumentu -command reprezentuje polecenie złożone, jak opisano w poleceniach złożonych.

Następnie 2.9.4 Związek Komendyhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04:

(związek-lista) [...] Zmienne zadania i wbudowane komendy, które mają wpływ na środowisko nie powinny obowiązywać po lista kończy się.

{lista złożonych;} Wykonaj listę złożonych w bieżącym środowisku procesu.

Semantyka są takie same, jak przy użyciu () bez definicji funkcji: nie tworzy nowy proces, ale pobiera wykonywane w co POSIX i atakujących nazywają „powłokę w tle środowiska”.

Powiązane problemy