2010-02-18 10 views
10

Czy ludzie zauważyli, że jeśli zmodyfikujesz źródło skryptu powłoki, wszystkie aktualnie uruchomione instancje mogą się nie powieść?Jak sprawić, by skrypty powłoki były odporne na zmienne źródła podczas ich działania?

To w mojej opinii jest bardzo złe; oznacza to, że zanim wprowadzę zmiany, muszę się upewnić, że wszystkie wystąpienia skryptu zostały zatrzymane. Moje preferowane zachowanie byłoby takie, że istniejące skrypty nadal działają ze starym kodem źródłowym, a nowe instancje używają nowego kodu (np. Co się dzieje z programami perl i python).

Czy ludzie mają jakieś dobre obejścia tego zachowania, inne niż wstępne skopiowanie skryptu powłoki do pliku tymczasowego i uruchomienie z tego?

Dzięki, /Yga

+0

Można również usunąć skrypt podczas jazdy, aby uniknąć edycji. Zobacz [ten post] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-the-run) z tego powodu i jak go zautomatyzować. –

Odpowiedz

16

Bardzo niewielki dodatek do innych odpowiedzi poniżej:

#!/bin/sh 
{ 
    # Your stuff goes here 
    exit 
} 

exit na końcu jest ważna. W przeciwnym razie plik skryptu może być nadal dostępny na końcu, aby zobaczyć, czy są jeszcze jakieś linie do interpretacji.

To pytanie zostało później zamieszczać tutaj: Can a shell script indicate that its lines be loaded into memory initially?

+1

Rozwiązanie Jonathana Lefflera jest dobre, ale nie działało dla mnie bez wyjścia :-) – YGA

2

upewnić się, że powłoka ma przeanalizować cały plik przed wykonaniem któregokolwiek z nim:

#!/bin/ksh 
{ 
all the original script here 
} 

To załatwia sprawę.

Nawiasem mówiąc, w Perlu (i zakładam, że Python), program analizuje cały plik przed wykonaniem któregokolwiek z nich, dokładnie tak, jak zaleca się tutaj. Z tego powodu zazwyczaj nie występuje problem z Perl lub Pythonem.

+0

Ten kod ma wadę. Zobacz [odpowiedź użytkownika "anonimowy"] (http://stackoverflow.com/a/2358432/780703). –

2

Pożądane zachowanie może nie być możliwe, w zależności od złożoności skryptów powłoki, które są zaangażowane.

Jeśli pełny skrypt powłoki jest zawarty w pojedynczym pliku źródłowym, a ten plik jest w pełni przeanalizowany przed wykonaniem, to skrypt powłoki jest ogólnie bezpieczny przed modyfikacjami kopii na dysku podczas wykonywania. Zawijanie wszystkich instrukcji wykonywalnych do funkcji (lub szeregu funkcji) zazwyczaj osiąga cel, do którego dążysz.

#!/bin/sh 

doit() 
{ 
# Stuff goes here 
} 
# Main 
doit 

Trudność pojawia się, gdy skrypt powłoki "zawiera" inne skrypty powłoki (np. "." Lub "źródło"). Jeśli te elementy są zawijane w funkcję, nie są analizowane, dopóki nie zostanie osiągnięte to polecenie w przepływie wykonywania. To sprawia, że ​​skrypt powłoki jest podatny na zmiany w tym zewnętrznym kodzie.

Ponadto, jeśli skrypt powłoki uruchamia dowolny program zewnętrzny (np. Skrypt powłoki, skompilowany program, itp.), Wynik ten nie jest przechwytywany, dopóki ten moment wykonania nie zostanie osiągnięty (jeśli kiedykolwiek).

#!/bin/sh 

doit() 
{ 
    if [[some_condition]] ; then 
     resultone=$(external_program) 
    fi 
} 
# Main 
doit 
+0

Twój kod powinien być traktowany jako pseudo-kod dla 'sh'. –

Powiązane problemy