2009-08-20 17 views
7

Chcę utworzyć prosty skrypt bash, aby uruchomić program Java na OS X. Nazwy pliku, ścieżki pliku i natychmiastowego folderu roboczego zawierają spacje. Kiedy to zrobić:Bash OS X: dirname

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

uzyskać

usage: dirname path 

Próbowałem również wprowadzanie cytatów w najróżniejszych miejscach. Najbardziej wymyślnym przykładem jest

Nic nie zadziałało. Otrzymuję komunikat o błędzie lub tę tajemniczą wiadomość "use: dirname path".

Jakie inne metody mogą działać?


Edit: to nie wydaje się być problemem dla każdego, ale ja po prostu tak musi być moja skrzynka. Przyjmuję poniżej mój post, ponieważ jest to jedyne rozwiązanie, które działało dla tego konkretnego problemu. Jednak zdecydowanie korzystam z rozwiązań, które wydają się działać dla wszystkich i naprawdę doceniają pomoc każdej osoby.

+0

Co daje wydajność "echo 0 $"? dirname może mieć problem z czymś konkretnym o wartości 0 USD.Czy próbowałeś uruchomić to ze skryptem w innym katalogu? – fbrereto

+0

Twój drugi przykład działa dla mnie z katalogiem na sześć poziomów, gdzie każdy inny przodek ma co najmniej jedną spację w nazwie. – Chuck

+0

kiedykolwiek spróbuj spojrzeć na stronę manuala dirname? –

Odpowiedz

3

Co ostatecznie pracował dla mnie zmienia się następująco:

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

do tego:

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

ten obsługuje również nazwy plików i ścieżki plików zawierających spacje. Oto, gdzie znalazłem go: http://rentzsch.com/unix/locationAwareCommandFiles

+0

Po prostu ciekawy - co było nie w moim i Neda rozwiązaniu? Chciałbym zaktualizować moją odpowiedź, jeśli jest odpowiednia dla archiwów. –

+1

Och, widzę. Z powłoki. Chłodny. –

+0

@Sean: Nadal otrzymywałem "usage: dirname path". Myślę, że to ma coś wspólnego z moją maszyną. Ale to rozwiązanie z powłoki działało dla mnie. Dziwne. – Dinah

12

Co o:

cd "$(dirname "$0")" 

To działa na mnie tutaj.

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

Uciekając wewnętrzne cytaty podwójnych jest niepotrzebna:

cd "`dirname "$0"`" 

Ale to nie dostać się do źródła problemu, czyli że jakoś wartość $ 0, wydaje się być pusta, czy może coś dziwnego. Spróbuj zmienić skrypt w ten sposób:

bash -x scriptname 

Powoduje wyświetlenie każdej linii ze zmiennymi interpolowanymi przed uruchomieniem. Jest bardzo przydatny do debugowania. Również bardzo pomocne są:

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

Hej nie wiesz o tym ... Ale czy to możliwe, że

#!/bin/sh 

wskazuje na coś, co nie jest bash? To, czego zwykle używam, to:

#!/usr/bin/bash 

Całkiem nowy w całym skrypcie, więc nie jestem pewien.