2011-09-09 15 views
7

muszę wykonać groovy skrypt z bash, i muszę mieć skrypt katalogu roboczego katalogu istnieje wJak wykonać dowolny skrypt zawierający katalog roboczy katalogu?

Oznacza to, że w moim skrypcie bash, że to robię.

/opt/script/myscript.groovy & 

Ale to wydaje się ustawić katalog roboczy na /etc/init.d, katalog, z którego dzwonię. Jak zmienić katalog roboczy tego skryptu na /opt/script?

+0

Odpowiedź jest tutaj lub w innej formie inny: http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in – Chris

+0

@Chris: Z wyjątkiem tego. Arbitralny skrypt oznacza * nie bash *. Konkretne odpowiedzi w Bash będą anulowane. –

Odpowiedz

7

/etc/init.d

prawdopodobnie jesteś runnig (początkowy), który skrypt z /etc/init.d?

Dodaj cd /opt/script w pierwszej linii skryptu

LUB

... aby zachować dynamiczny, dodać: cd "$(dirname "$0")"

+0

Łatwo. CD przed resztą skryptu działa dobrze. –

1

coś takiego może:

SCRIPT=/opt/script/myscript.groovy 
pushd `dirname $SCRIPT` 
./`basename $SCRIPT` 
popd 
+1

'Popd' nie jest konieczne w żadnym środowisku poza plikiem DOS .BAT; co robi proces, aby zmienić katalog, nie może mieć wpływu na katalog programu, który go uruchamia. –

2

W wersji bash umieszczenie tego w skrypcie działa najlepiej:

HERE=$(cd -- $(dirname ${BASH_SOURCE[0]}) > /dev/null && pwd) 
cd -- "$HERE" 

to uda nawet z następującym wezwaniem (z /path/to/script.sh):

PATH="/path/to:$PATH" bash script.sh 

gdzie HERE=$(dirname $0) zawiedzie.

Opcjonalnie można też użyć pwd -P zamiast tylko pwd, następnie $HERE będzie zawierać realpath (canonicalized absolutne ścieżki dostępu) Od man 3 realpath.

15

Jeśli używasz start-stop-daemon wewnątrz skryptu /etc/init.d, można skorzystać z parametru -d dla osiągnięcia tego celu:

-d, --chdir path 
      Chdir to path before starting the process. This is done after the chroot if the -r|--chroot option is set. When not specified, start-stop-daemon will chdir to the root directory before starting the process.