2011-07-16 14 views
9

El siguiente es un caso de prueba simple para lo que quiero ilustrar.La expansión de la variable es diferente en zsh que en bash

En bash,

# define the function f 
f() { ls $args; } 

# Runs the command `ls` 
f 

# Runs the fommand `ls -a` 
args="-a" 
f 

# Runs the command `ls -a -l` 
args="-a -l" 
f 

Pero en zsh

# define the function f 
f() { ls $args } 

# Runs the command `ls` 
f 

# Runs the fommand `ls -a` 
args="-a" 
f 

# I expect it to run `ls -a -l`, instead it gives me an error 
args="-a -l" 
f 

La última línea de la zsh al anterior, me da el siguiente error

ls: invalid option -- ' ' 
Try `ls --help' for more information. 

creo zsh está ejecutando

ls "-a -l" 

que es cuando me sale el mismo error.

Entonces, ¿cómo consigo el comportamiento de bash aquí?

No estoy seguro si tengo claro, hágamelo saber si hay algo que desea saber.

+2

esto no responde a su pregunta, pero me gustaría considerar esto mejor: 'f() {$ ls "@"; }; f -a -l' –

+0

@glenn, sí, definitivamente lo es. Como dije, esto es solo una ilustración de un problema mayor que tengo, donde tengo que usar la variable args. –

+1

@ShrikantSharat Si está escribiendo scripts para bash y zsh (y ksh), no haga esto con la variable 'args'. Use una matriz en su lugar. – Gilles

Respuesta

21

La diferencia es que (de forma predeterminada) zsh no se divide la palabra para expansiones de parámetros no citadas.

Puede activar “normal” la división de palabras estableciendo la opción SH_WORD_SPLIT o mediante el uso de la bandera = en una expansión individuales:

ls ${=args} 

o

setopt SH_WORD_SPLIT 
ls $args 

Si las matrices de apoyo a sus conchas objetivo (ksh, bash, zsh), entonces es mejor que uses una matriz:

args=(-a -l) 
ls "${args[@]}" 

Desde el zsh FAQ:

Desde el zsh Manual:

  • 14.3 Parameter Expansion

    Nota en particular, el hecho de que las palabras de parámetros no cotizados no se dividen automáticamente en los espacios en blanco a menos que la opción SH_WORD_SPLIT se establece; ver referencias a esta opción a continuación para más detalles. Esta es una diferencia importante de otras conchas.

  • SH_WORD_SPLIT

    campo Causas división que deba efectuarse a expansiones de parámetros no cotizados.

+0

Sí, eso es justo lo que quería. No sabía qué buscar en Google ni dónde buscarlo, ¿podría señalar alguna documentación que explique esto? Gracias por la respuesta. –

+0

Además, ¿el uso de '$ {= args}' es compatible con bash? Mis pruebas confirman que es ... –

+3

Todas mis versiones de * bash * (3.2.48 y 4.2.10) rechazan '$ {= ...}'. Estoy bastante seguro de que es específico de * zsh *. Si tiene como objetivo * bash * y * zsh *, puede probar una matriz (en mi respuesta actualizada). –

Cuestiones relacionadas