2009-11-02 14 views
19

He estado tratando de hacer un guión de inicio usando start-stop-daemon. Estoy atascado en los argumentos para el daemon. Quiero mantener estos en una variable en la parte superior del script, pero no puedo hacer que las citas se filtren correctamente.start-stop-daemon argumentos citados malinterpretados

Usaré ls aquí para no tener que mirar los binarios y los argumentos que la mayoría de la gente no conocerá o no le importará.

El resultado final Busco es para arranque y parada ... a correr ls -la "/ carpeta con el espacio /"

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

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

doble escapar de las opciones y tratando innumerables variaciones de las cotizaciones no ayuda ... Entonces terminan en el daemon que siempre están en mal estado. Encerrando $ DAEMON_OPTS entre comillas cambia las cosas ... luego se ven como una desde la cita ... nunca el número correcto :)

Haciendo eco de la línea de comandos (start-stop ...) imprime exactamente el cosas correctas para pantalla. Pero el daemon (el real, no el ls) se queja de la cantidad incorrecta de argumentos.

¿Cómo especifico una variable para que las comillas dentro de ella lleguen al daemon correctamente?

+0

Para aclarar. He intentado muchas de las variaciones de cotizaciones habituales. comillas dobles dentro del cuerpo, "-la '/ carpeta ... doble dentro de comillas simples,' -la"/carpeta ... citas escapadas, "-la \"/carpeta ... \ "" usando únicamente barra invertida para cada espacio en su lugar, carpeta \ con ... I imagino vagamente que el problema es de alguna manera con start-stop-daemon y sus interpretaciones ... pero eso no tiene mucho sentido ya que reemplazó la variable en el línea de comando produce resultados de funcionamiento. –

Respuesta

7

Yo pensé que había puesto las citas finales usadas en mi script de inicio de trabajo:

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

Obviamente un ejemplo incompleto y no funcional, pero espero que se obtiene la esencia de la misma. Las citas dobles con el par interno escapado es lo que hizo el truco.

+0

Esto puede funcionar, pero requiere que modifiques el script de inicio en sí, lo cual es una gran pérdida. Quiero poder establecer variables en/etc/default/whatever y luego no tener que mantenerlas en un script de inicio cuando actualiza un paquete. – deltaray

+0

Creo que siempre debe incluir ejemplos completos en lugar de ejemplos a medias. –

13

Trate

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

Lo que pasa es que las cotizaciones externas de DAEMON_OPTS son despojados, pero los (comillas simples) interiores permanecen. Entonces la siguiente línea va a decir:

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

que es lo que quieres.

También es posible lograr el mismo efecto al escapar, pero se necesitan muchos escapes para esto: Primero, proteger las comillas durante la asignación, luego, cuando se analiza la línea de inicio y las variables se expanden e incluso una vez más o menos :) bash -x es tu amigo para cosas como esas.

[EDITAR] El código anterior funciona con el shell Bourne y Korn en cualquier cosa que no sea Linux. En Linux, con ksh o bash, la cáscara se sumará cotizaciones adicionales que estropear todo el asunto:

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

Si lo ejecuta con -x, verá:

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

lo que sólo el La primera palabra obtiene protección (probablemente porque contiene un carácter especial). Si añado comillas simples $FOLDER, me sale:

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

Bien hecho. Solución: Dividir las opciones en dos variables: Uno con las opciones y el otro con la ruta:

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

[Edit2] Esto funciona, también:

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

es decir, poner las palabras en una matriz.

+0

Tal vez estoy haciendo algo mal, pero esta solución no funciona cuando lo intento? –

+0

Sí, no funciona con bash:/Lo he usado con éxito para pasar argumentos a los subíndices usando un ciclo sobre los argumentos y usando 'args =" $ args '$ opt' "' y luego usando '$ cmd $ args' (sin comillas). Funciona con Bourne y Korn Shell. –

+0

A menos que esté usando ksh en Linux (probado con ksh-93s-59.7). –

0

¿Has intentado hacerlo al revés con las comillas? De esta manera:

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

No estoy seguro, pero eso podría funcionar?

(Lo habría publicado como un comentario a la respuesta anterior, si hubiera tenido suficiente reputación para hacerlo).

+0

Lo intenté y cualquier otra combinación de citas que conozca ... no tuve suerte. –

0

Siempre que tenga una variable bash con espacios, asegúrese de usar comillas cuando se refiera a ella.

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

Cuestiones relacionadas