2009-11-02 9 views
19

Próbowałem utworzyć skrypt init za pomocą start-stop-daemon. Utknąłem na argumentach demona. Chcę zachować je w zmiennej u góry skryptu, ale nie mogę poprawnie wycenić cytatów.start-stop-daemon cytowane argumenty błędnieinterpretowane

Użyję ls tutaj, abyśmy nie musieli patrzeć na binaria i argumenty, których większość ludzi nie zna i nie dba o nie.

Efektem końcowym szukam jest dla start-stop ... do uruchomienia ls -la "/ folder z miejsca /"

DAEMON=/usr/bin/ls 
DAEMON_OPTS='-la "/folder with space/"' 

start-stop-daemon --start --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS 

Pokój ucieczki opcje i próbuje niezliczone wariacje notowań nie pomagajcie ... Potem kończą na demona, którego zawsze zawiedli. Załączając $ DAEMON_OPTS w cudzysłowie zmienia rzeczy ... to są one postrzegane jako jeden cytat ... ponieważ nigdy prawy numer chociaż :)

nawiązując do wiersza poleceń (start-stop ...) drukuje dokładnie tak odpowiednie rzeczy do wyświetlenia. Ale demon (prawdziwy, nie ls) narzeka na złą liczbę argumentów.

Jak określić zmienną, aby cytaty w niej były poprawnie przesyłane do demona?

+0

Aby wyjaśnić. Próbowałem wielu zwykłych odmian cytatów. pojedynczy wewnątrz podwójnego cudzysłowu, "-la"/folder ... podwójny wewnątrz pojedynczego cudzysłowu, '-la "/ folder ... Escaped quotes," -la \ "/ folder ... \" " tylko z użyciem ukośnik odwrotny dla każdego miejsca zamiast tego, folder \ z ... Mam mgliste wyobrażenie, że problem jest jakoś z start-stop-daemonem i jego interpretacjami ... ale to nie ma większego sensu, odkąd zastępuję zmienną w Wiersz poleceń daje wyniki działania. –

Odpowiedz

7

pomyślałem, że pisać ostatnie cytaty użyte w moim skrypcie pracy:

COMMAND="/path/to/script -opt param param2 param3" 
DAEMON_OPTS=" 0.0.0.0:$PORT -dest $OUTPUT_DIRECTORY -command" 

start-stop-daemon --start --background --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS "\"$COMMAND\"" 

Oczywiście niekompletnego i niefunkcjonalnych przykład, ale mam nadzieję, że sens tego. Podwójne cytaty z wewnętrzną parą uciekły, to była podstawa.

+0

Może to działać, ale wymaga modyfikacji samego skryptu init, co stanowi dużą stratę. Chcę móc ustawić zmienne w/etc/default/cokolwiek, a następnie nie trzeba ich utrzymywać w skrypcie init podczas aktualizacji pakietu. – deltaray

+0

Myślę, że zawsze powinieneś zawierać pełne przykłady zamiast pół przykładów. –

13

Spróbuj

DAEMON_OPTS="-la '/folder with space/'" 
start-stop-daemon --start ... -- $DAEMON_OPTS 

Co się dzieje, że zewnętrzne notowania DAEMON_OPTS są usuwane, ale wewnętrzne (pojedyncze cudzysłowy) pozostają. Tak więc następna linia będzie brzmiała:

start-stop-daemon --start ... -- -la '/folder with space/' 

czego chcesz.

Możliwe jest również uzyskanie tego samego efektu przy wychodzeniu, ale potrzebujesz do tego wielu ucieczek: Po pierwsze, aby chronić cytaty podczas przypisywania, a później, gdy linia początkowa zostanie przeanalizowana, a zmienne rozszerzone i być może nawet raz jeszcze lub mniej. :) bash -x jest twoim przyjacielem na takie rzeczy.

[EDYCJA] Powyższy kod działa z powłoką Bourne i Korn na wszystkich komputerach oprócz Linuksa. W systemie Linux, z ksh lub bash, powłoka doda dodatkowe cytaty, które zepsuć całość:

FOLDER="/folder with space/" 
DAEMON_OPTS="-la $FOLDER" 
start-stop-daemon --start ... -- $DAEMON_OPTS 

Jeśli uruchomić go z -x, zobaczysz:

FOLDER='/folder with space/' 
DAEMON_OPTS='-la ~/folder with space/' 
ls -la '~/folder' with space/ 

więc tylko pierwsze słowo dostaje ochronę (prawdopodobnie dlatego, że zawiera znak specjalny). Jeśli dodać apostrofów wokół $FOLDER, otrzymuję:

FOLDER='/folder with space/' 
DAEMON_OPTS='-la '\''~/folder with space/'\''' 
ls -la ''\''~/folder' with 'space/'\''' 

dobrze zrobione. Obejście: Podział opcje do dwóch zmiennych: jedna z opcji, a drugi ze ścieżką:

start-stop-daemon --start ... -- $DAEMON_OPTS "$DAEMON_PATH" 

[EDIT2] To działa też:

FOLDER="$HOME/folder with space/" 
opt[0]=-la 
opt[1]=$FOLDER 
ls "${opt[@]}" 

tj umieścić słowa na tablicy.

+0

Może robię coś nie tak, ale to rozwiązanie nie działa, kiedy go wypróbuję? –

+0

Tak, nie działa z bash:/Używałem tego pomyślnie do przekazywania argumentów do indeksów dolnych za pomocą pętli ponad argumentami i używania 'args =" $ args '$ opt' "', a następnie używania '$ cmd $ args' (bez cytatów). Współpracuje z Bourne i Korn Shell. –

+0

Chyba, że ​​używasz ksh na Linuksie (testowane z ksh-93s -59.7). –

0

Czy próbowałeś zrobić to na odwrót z cytatami? W ten sposób:

 
DAEMON_OPTS='-la "/folder with space/"' 

Nie jestem pewien, ale to może zadziałać?

(Powiedziałbym to jako komentarz do poprzedniej odpowiedzi, gdybym tylko miał dość reputacji, aby to zrobić).

+0

Spróbowałem tego i każdej innej kombinacji, którą znam ... nie szczęścia. –

0

Ilekroć masz zmienną bash ze spacjami, upewnij się, że używasz cudzysłowów, gdy się do niej odwołujesz.

start-stop-daemon --start --make-pidfile --pidfile $ PID --exec $ DAEMON - "$ DAEMON_OPTS"