2013-01-22 6 views
5

Czy możliwe jest pobranie fragmentu Bash, ale tylko dostarczenie funkcji z wnętrza, jeśli pewien warunek jest prawdziwy?W jaki sposób źródłowy fragment bash warunkowo może pełnić funkcję powłoki pozyskiwania?

Pytam więc, czy mogę bezwarunkowo pozyskiwać wszystkie pliki z katalogu, ale pliki źródłowe zawierają logikę zapewniającą funkcje powłoki pozyskiwania.

Przykład:

  • .bashrc źródła folderu cały sub .bashrc.d
  • .bashrc.d/xyz zapewnia funkcję adduser2group który działa na starych systemach, gdzie usermod nie obsługuje -a -G
  • .bashrc.d/xyz powinna zapewnić tę funkcję tylko do powłoka powłoki , jeśli działa na starym systemie.

Moja obecna metoda jest warunkowo utworzyć alias nazwie adduser po programie Debiana (alias adduser=adduser2group). Dlatego implementuję tylko semantykę adduser <user> <group>, ale nadal jest to pomocne.

Czy istnieje rozwiązanie, które nie wymaga tego obejścia? Wszakże ta metoda oznacza szansę na zderzenia nazw, których wolałbym uniknąć.

+0

jeśli w ogóle zna jak 'prace configure', to po prostu nie 1-time badania nieniszczące, aby określić, jakie środowisko jest uruchomiony w, i używa logiki warunkowej, aby ustawić ścieżki , nazwy programów i parametry, aby zapewnić spójne doświadczenie skryptowe. Wydaje się, że to też będzie działało dla ciebie (i że prawie i tak tam będziesz). Tylko moje 2 centy warte. Powodzenia. – shellter

Odpowiedz

2

można określić funkcje, które chcesz, a gdy dany warunek jest spełniony, po prostu wyłączony funkcję:

$ function alpha() { echo $1; } 
$ alpha 10 
10 

Oceniając kondycję - a biorąc pod uwagę to jest prawdziwe:

$ if [[ your condition ]]; then unset alpha; fi 
$ alpha 10 
alpha: command not found 
+2

Leniwe podejście, którego używałem, polega na tym, aby funkcja ponownie definiowała się przy pierwszym jej wywołaniu. 'alpha() {jeśli warunek; następnie alpha() {stuff; }; else alpha() {:; }; fi; alfa; } ' – kojiro

+0

@kojiro To bardzo interesujące w przypadkach, gdy wiesz, że połączenie zostanie wykonane i nie chcesz żadnych błędów. Ładne rozwiązanie! – Rubens

+0

@Rubens: świetna odpowiedź. Od razu do rzeczy. Nie wiedziałem, że w ten sposób mogę użyć 'unset'. Dzięki. +1, a zaakceptuję, gdy tylko to zadziała. – 0xC0000022L

3

Można użyć standardowej logiki powłoki, aby kontrolować, czy zdefiniowane funkcje nie są.

lib.sh:

if true; then 
    foo() { 
     echo foo 
    } 
else 
    bar() { 
     echo bar 
    } 
fi 

test:

#!/bin/bash 

. ./lib.sh 
foo 
bar 

Po uruchomieniu go, tylko foo jest zdefiniowana:

$ bash test 
foo 
test: line 5: bar: command not found 

Zastępca if true z bardziej odpowiednim dla danego zastosowania logiki ...

+0

Dziękuję za odpowiedź. Dobrze to również działa. Miałem wrażenie, że to nie zadziała.+1 – 0xC0000022L

1

Alternatywnie, wygląda na to, że zadanie wykonuje także return. Więc można powiedzieć:

[[ condition ]] || return 
Powiązane problemy