2009-08-20 10 views
7

Je souhaite créer un script bash simple pour lancer un programme Java sous OS X. Les noms du fichier, le chemin du fichier et le dossier de travail immédiat contiennent tous des espaces. Quand je fais cela:OS X bash: dirname

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

Je reçois

usage: dirname path 

J'ai aussi essayé de mettre des citations dans toutes sortes d'endroits différents. L'exemple le plus élaboré étant

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

Rien n'a fonctionné. Je reçois des messages d'erreur ou ce message cryptique "usage: dirname path".

Quelles sont les autres méthodes qui pourraient fonctionner?


Edit: cela ne semble pas être un problème pour tout le monde, mais moi il doit juste être ma boîte. Je vais accepter mon propre message ci-dessous parce que c'est la seule solution qui a fonctionné pour ce problème spécifique. Cependant, je suis définitivement upvoting les solutions qui semblent fonctionner pour tout le monde et apprécie vraiment l'aide de tout le monde.

+0

Quel est le rendement de 'echo $ 0'? dirname peut avoir un problème avec quelque chose de spécifique à propos de la valeur de $ 0.Avez-vous essayé d'exécuter ceci avec le script dans un répertoire différent? – fbrereto

+0

Votre deuxième exemple fonctionne pour moi avec un répertoire de six niveaux de profondeur où tous les autres ancêtres ont au moins un espace dans son nom. – Chuck

+0

déjà essayé de regarder la page de manuel dirname? –

Répondre

3

Ce qui a finalement fonctionné pour moi est en train de changer ceci:

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

à ceci:

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

Cela prend également en charge les noms de fichiers et les chemins de fichiers contenant des espaces. Voici où je l'ai trouvé: http://rentzsch.com/unix/locationAwareCommandFiles

+0

Juste curieux - qu'est-ce qui a échoué avec ma solution et celle de Ned? Je voudrais mettre à jour ma réponse si cela convient aux archives. –

+1

Oh je vois. Z shell. Cool. –

+0

@Sean: Je continuais à obtenir "usage: dirname path". Je pense que c'est quelque chose à voir avec ma machine. Mais cette solution shell z a fonctionné pour moi. Bizarre. – Dinah

12

Qu'en est-:

cd "$(dirname "$0")" 

qui fonctionne pour moi ici.

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

Échapper les guillemets internes est inutile:

cd "`dirname "$0"`" 

Mais qui ne reçoit pas à la racine du problème, qui est que en quelque sorte la valeur de 0 $ semble être vide, ou peut-être Quelque chose d'étrange. Essayez de changer en cours d'exécution de votre script ainsi:

bash -x scriptname 

Cela se fera l'écho de chaque ligne, avec des variables interpolées, avant de l'exécuter. C'est très utile pour le débogage. Aussi très utile sont:

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

Hey ne sais pas à ce sujet ... Mais est-il possible que vos

#!/bin/sh 

Points à quelque chose qui est bash pas? Ce que j'utilise habituellement est:

#!/usr/bin/bash 

Assez nouveau à l'ensemble de la chose de script donc pas sûr.