2010-08-08 13 views
5

En Bash, que se puede utilizar el siguiente código:secuencia de desempaquetado en la variable

[ "$sshcmd" = "" ] && sshcmd="ssh -someopts myhost" 

$sshcmd "echo hello world" 

En ZSH, el mismo código no funciona porque se trata de encontrar una "ssh -someopts myhost" ejecutable. ¿Cómo puedo hacer lo mismo en ZSH?

Gracias, Albert

+0

favor ver [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –

+0

@Dennis: soy el segundo caso, pero en mi caso, el usuario pasa el comando a través de un parámetro o vía una variable env al script. O si no lo hace, el script usa algunos valores predeterminados. ¿Cómo podría resolver esto? – Albert

+0

Probablemente tendrá que usar las sugerencias en la respuesta (y comentario) a continuación (que son consistentes con la información en ese enlace). Sin embargo, debe tener en cuenta que existen posibles implicaciones de seguridad de la ejecución de comandos pasados ​​como argumentos. –

Respuesta

2

Para dividir una cadena en blanco (en términos más generales, en $IFS) al igual que otros proyectiles: $=sshcmd

Pero en su lugar debe hacer sshcmd una matriz, para que sus comandos todavía funciona si uno de las opciones contiene espacios en blanco:

sshcmd=(ssh -someopts myopts) 
$sshcmd[@] "echo hello world" 

Esto se aplica a bash y ksh también, por cierto; pero también debe proteger a la variable de matriz de sustitución frente a una mayor expansión de división y nombre de archivo:

sshcmd=(ssh -someopts myopts) 
"${sshcmd[@]}" "echo hello world" 
+0

Estoy obteniendo esto a través de un entorno de Bash, por lo que creo que una matriz no es una opción (¿o cómo puedo convertirla automáticamente?). Pero '$ = sshcmd' funciona, ¡gracias! – Albert

+1

@Albert Para dividir algo como lo hace el shell, use '$ {(z) sshcmd}'. Manejará el caso cuando sshcmd contenga parámetros cotizados: si sshcmd contiene una cadena 'a 'bc d'', '$ = sshcmd' la dividirá en' a', '' b',' c', 'd'' , mientras que '$ {(z) sshcmd}' en 'a',' 'bc d''. También maneja '$ (...)', '" ... "', etc; vea la sección de EXPANSIÓN DE PARÁMETROS en man zshexpn. – ZyX

+0

Gracias @ZyX, ¡esto parece mucho más útil! – Albert

Cuestiones relacionadas