2010-10-07 9 views
49

użyłem „Katalog” zmiana w moim skrypt powłoki (bash)Jak uruchomić 'cd' w skrypcie powłoki i pozostać tam po zakończeniu skryptu?

#!/bin/bash 
alias mycd='cd some_place' 
mycd 
pwd 

pwd drukuje some_place poprawnie, ale po zakończeniu skrypt mój bieżący katalog roboczy nie ulega zmianie.

Czy mogę zmienić ścieżkę przez skrypt?

+0

Wprowadzam kilka zmian w kodzie przykładowym. W bashu ** cd ** sholud robi alias lub funkcję. – qrtt1

+0

Podobna: [Dlaczego "cd" nie działa w skrypcie powłoki bash? "] (Http://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script) –

Odpowiedz

65

Trzeba pozyskać plik jako:

. myfile.sh 

lub

source myfile.sh 

Bez pobierania zmian nastąpi w podrzędnej powłoce, a nie w powłoce macierzystej, która wywołuje skrypt. Ale kiedy źródła pliku, wiersze w pliku są wykonywane tak, jakby zostały wpisane w linii poleceń.

14

Skrypt uruchamiany jest w oddzielnej podpowłoce. Że powłoki w tle zmienia katalog, nie skorupa go uruchomić w Możliwym rozwiązaniem jest source skrypt zamiast wykonywania go.

# Bash 
source yourscript.sh 
# or POSIX sh 
. yourscript.sh 
+0

dziękuję za tę wskazówkę – qrtt1

+0

wielkie napr.my problem rozwiązany – Tracy

12

Podczas pozyskiwania skryptu, który chcesz uruchomić, jest jednym z rozwiązań, powinieneś wiedzieć, że ten skrypt może bezpośrednio modyfikować środowisko twojej obecnej powłoki. Również nie jest możliwe przekazywanie argumentów.

Innym sposobem wykonania jest zaimplementowanie skryptu jako funkcji w bash.

function cdbm() { 
    cd whereever_you_want_to_go 
    echo arguments to the functions were $1, $2, ... 
} 

Ta technika jest używana przez autojump: http://github.com/joelthelion/autojump/wiki aby zapewnić Państwu naukę zakładki katalogów powłoki.

1

każdym uruchomieniu skryptu logowania na swojej skorupy, nowa podproces zrodził i wykonanie skryptu odbywa się w subshell.Once skrypt zakończeniu zjazdu podpowłoki i następuje powrót do shell.Hence logowania gdy robisz cd poprzez skrypt, katalog zostaje zmieniony na ścieżkę określoną przez cd, ale skrypt czasu powróci do powłoki logowania do katalogu roboczego, od którego uruchomiłeś skrypt.

Droga do pokonania to używanie,

source yourscript.sh 

jakiego źródła robi to wykonuje skrypt jako skrypt TCL, to znaczy, że ma taki sam efekt jak po wpisaniu każdego wiersza w wierszu poleceń swojego loginu powłoka i jest ona wykonywana z tego miejsca. Tak więc, gdy skrypt kończy się po cd, pozostaje w tym katalogu.

+0

dobrze wyjaśnione - dziękuję – SaminOz

3

Można to osiągnąć przez sourcing. Sourcing to wykonanie skryptu w tej samej powłoce, podczas gdy normalne wykonanie (sh test.sh lub ./test.sh) utworzy skrypt podrzędny i wykonawczy. Test

.sh

cd development/ 
ls 
# Do whatever you want. 

Execute test.sh przez

source test.sh 

. jest najkrótsza notacja dla source. Więc można również zrobić przez

. test.sh 

Spowoduje to uruchomienie skryptu i zmienić katalog bieżącej powłoki do development/.

Powiązane problemy