2012-04-20 8 views
6

Me pregunto cómo los argumentos dados a una función en bash se pueden "reenviar" correctamente a otra función o programa.¿Cómo se pueden "reenviar" correctamente los argumentos de una función en bash?

Por ejemplo, en Mac OS X hay un programa de línea de comando open (man page) que abrirá el archivo especificado con su aplicación predeterminada (es decir, abriría un archivo * .h en Xcode o una carpeta en Finder, etc.) Me gustaría simplemente llamar al open sin argumentos para abrir el directorio de trabajo actual en Finder, o proporcionarle los argumentos típicos para usarlo normalmente.

Pensé: "¡Usaré simplemente una función!" Ja, no tan rápido allí, supongo. Esto es lo que tengo:

function open 
{ 
    if [ $# -eq 0 ]; then 
     /usr/bin/open . 
    else 
     /usr/bin/open "$*" 
    fi 
} 

simplemente llamando open funciona muy bien, se abre el directorio de trabajo en el Finder. Llamar al open myheader.h funciona muy bien, abre "myheader.h" en Xcode.

Sin embargo, al llamar al open -a /Applications/TextMate.app myheader.h para tratar de abrir el archivo en TextMate en lugar de Xcode, aparece el error "No se puede encontrar la aplicación denominada '/Applications/TextMate.app myheader.h'". Parece que pasar "$*" a /usr/bin/open hace que toda mi lista de argumentos se reenvíe como un solo argumento.

Cambiar la función a solo usar usr/bin/open $* (sin comillas) causa problemas en las rutas con espacios. Si llama al open other\ header.h, se produce el error "Los archivos/Usuarios/inspector-g/otro y/Usuarios/inspectivo-g/encabezado.h no existen", pero resuelve el otro problema.

Debe haber alguna convención para reenviar argumentos que me estoy perdiendo.

Respuesta

9

De hecho, olvidó "[email protected]", que está diseñado para este caso.

+0

Funcionó como un amuleto, muchas gracias. ¡Hay tantos de esos '$' vars! –

+0

De hecho '$ *' funciona cuando tiene que reenviar argumentos dentro de una cadena (por ejemplo, 'mosel -s -c" exec $ * "') –

Cuestiones relacionadas