2009-11-02 12 views
19

Ho cercato di creare uno script di init usando start-stop-daemon. Sono bloccato sugli argomenti del demone. Voglio mantenere questi in una variabile all'inizio dello script ma non riesco a far filtrare correttamente le quotazioni.argomenti citati start-stop-daemon erroneamente interpretati

userò ls qui così noi non dobbiamo guardare i binari e gli argomenti che la maggior parte gente non conoscono o si preoccupano.

Il risultato finale che sto cercando è di start-stop ... per eseguire ls -la "/ cartella con lo spazio /"

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

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

doppio sfuggire alle opzioni e cercando innumerevoli variazioni di citazioni non aiutare ... Poi finiscono al demone che sono sempre incasinati. Racchiudere $ DAEMON_OPTS tra virgolette cambia le cose ... poi si sono visti come un dato citazione ... non il numero giusto però :)

Facendo eco alla riga di comando (start-stop ...) stampe esattamente la cose giuste per lo schermo. Ma il demone (quello vero, non ls) si lamenta del numero sbagliato di argomenti.

Come faccio a specificare una variabile in modo che le quotazioni al suo interno vengono portati insieme al demone correttamente?

+0

Per chiarire. Ho provato molte delle solite variazioni delle quotazioni. singolo tra virgolette doppie, "-la '/ cartella ... doppio tra virgolette singole,' -la"/cartella ... virgolette di escape, "-la \"/cartella ... \ "" utilizzando solo barra rovesciata per ogni spazio invece, cartella \ con ... Immagino vagamente che il problema sia in qualche modo con start-stop-daemon e le sue interpretazioni ... ma non ha molto senso da quando ha sostituito la variabile sul la riga di comando produce risultati funzionanti. –

risposta

7

ho pensato di postare le citazioni finali utilizzati nel mio script di init di lavoro:

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\"" 

Ovviamente un esempio incompleta e non funzionale, ma spero che si ottiene l'essenza di esso. Le doppie virgolette con la coppia interna sono fuggite è ciò che ha fatto il trucco.

+0

Potrebbe funzionare, ma è necessario modificare lo script init stesso, che è una grande perdita. Voglio essere in grado di impostare le variabili in/etc/default/any e quindi non doverle mantenere in uno script di init quando si aggiorna un pacchetto. – deltaray

+0

Penso che dovresti sempre includere esempi completi invece di mezzi esempi. –

13

Prova

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

quello che succede è che le citazioni esterne delle DAEMON_OPTS sono spogliati ma gli interni (virgolette singole) rimangono. Quindi la riga successiva leggerà:

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

che è quello che vuoi.

È anche possibile ottenere lo stesso effetto con l'escaping ma per questo è necessario un sacco di escape: in primo luogo, per proteggere le virgolette durante l'assegnazione, quindi in seguito quando viene analizzata la riga iniziale e le variabili vengono espanse e forse anche ancora una volta o meno. :) bash -x è tuo amico per cose del genere.

[EDIT] Il codice qui sopra funziona con Bourne shell e Korn su qualsiasi cosa, ma Linux. Su Linux, con ksh o bash, la shell aggiungerà citazioni aggiuntivi che rovinare il tutto:

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

Se lo si esegue con -x, vedrete:

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

Quindi solo il la prima parola ottiene protezione (probabilmente perché contiene un carattere speciale). Se aggiungo apici intorno $FOLDER, ottengo:

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

ben fatto. Soluzione: Split le opzioni in due variabili: Uno con le opzioni e l'altra con il percorso:

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

[EDIT2] Questo funziona anche:

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

cioè mettere le parole in un array.

+0

Forse sto facendo qualcosa di sbagliato, ma questa soluzione non funziona quando la provo? –

+0

Sì, non funziona con bash:/L'ho usato con successo per passare argomenti agli indici usando un ciclo sugli argomenti e usando 'args =" $ args '$ opt' "' e quindi usando '$ cmd $ args' (senza virgolette). Funziona con Bourne e Korn Shell. –

+0

A meno che non si stia utilizzando ksh su linux (testato con ksh-93s-59.7). –

0

Hai provato a farlo viceversa con le virgolette? In questo modo:

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

Non sono sicuro, ma potrebbe funzionare?

(Avrei postato questo come commento alla risposta precedente, se solo avessi avuto abbastanza reputazione per farlo).

+0

Ho provato quello e qualsiasi altra combinazione di quote che conosco ... non fortuna. –

0

Ogni volta che si dispone di una variabile bash con spazi, assicurarsi di utilizzare le virgolette quando ci si riferisce ad esso.

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

Problemi correlati