2009-08-20 22 views
7

Quiero crear un script bash simple para iniciar un programa Java en OS X. Todos los nombres del archivo, la ruta del archivo y la carpeta de trabajo inmediata contienen espacios. Cuando hago esto:OS X bash: dirname

#!/bin/sh 
cd `dirname $0` 

me sale

usage: dirname path 

También he intentado poner comillas en todo tipo de lugares diferentes. El ejemplo más elaborado es

cd "`dirname \"$0\"`" 

Nada ha funcionado. Recibo mensajes de error o el mensaje críptico "use: dirname path".

¿Qué otros métodos podrían funcionar?


Editar: esto no parece ser un problema para nadie más que yo por lo que debe ser mi cuadro. Voy a aceptar mi propia publicación a continuación porque es la única solución que funcionó para este problema específico. Sin embargo, definitivamente estoy promocionando las soluciones que parecen funcionar para todos los demás y realmente aprecio la ayuda de todos.

+0

¿Qué significa 'echo $ 0' yield? dirname podría tener un problema con algo específico sobre el valor de $ 0.¿Has intentado ejecutar esto con el script en un directorio diferente? – fbrereto

+0

Su segundo ejemplo funciona para mí con un directorio de seis niveles de profundidad donde cada antecesor tiene al menos un espacio en su nombre. – Chuck

+0

alguna vez intente ver la página de manual de dirname? –

Respuesta

3

Lo que finalmente funcionó para mí está cambiando esto:

#!/bin/sh 
cd `dirname $0` 

A esto:

#! /bin/zsh 
cd "${0:h}" 

Esto también es compatible con nombres de archivo y rutas de archivos que contienen espacios. Aquí es donde la encontré: http://rentzsch.com/unix/locationAwareCommandFiles

+0

Simplemente curioso: ¿qué estaba fallando con mi solución y la de Ned? Me gustaría actualizar mi respuesta si corresponde para los archivos. –

+1

Oh, ya veo. Caparazón Z Guay. –

+0

@Sean: Todavía seguí recibiendo "usage: dirname path". Creo que es algo relacionado con mi máquina. Pero esta solución de shell Z funcionó para mí. Extraño. – Dinah

12

¿Qué hay de:

cd "$(dirname "$0")" 

que funciona para mí aquí.

5
#!/bin/sh 
cd "$(dirname "$0")" 
2

escapar de las comillas dobles interiores es innecesaria:

cd "`dirname "$0"`" 

Pero eso no quiere llegar a la raíz del problema, que es que de alguna manera el valor de 0 $ parece que está vacío, o tal vez algo extraño. Intente cambiar de ejecutar el script de esta manera:

bash -x scriptname 

Esto se hará eco de cada línea, con variables interpolados, antes de ejecutarlo. Es muy útil para la depuración. También bastante útiles son:

-u: abort on attempt to use undefined variable 
-e: abort on first error 
0

Hey no está seguro acerca de esto ... ¿Pero es posible que sus

#!/bin/sh 

Puntos a algo que no se golpean? Lo que suelo usar es:

#!/usr/bin/bash 

Bastante nuevo en todo lo de scripting, así que no estoy seguro.