2010-12-16 11 views

Odpowiedz

11

Nie możesz. Zmiany w bieżącym katalogu mają wpływ tylko na bieżący proces.

2

Ignacio ma rację. Jednak, jak haniebne siekać (całkowicie źle poinformowani i to naprawdę powinien dać mi co najmniej 10 głosów w dół) można exec nową powłokę kiedy skończysz

 
#!/bin/bash 
... 
cd/
exec bash 
+1

Twoje zapytanie downvotes zarabia Ci upvote –

+0

Doprowadzi to do dodatkowej powłoce biegania (oryginalny jednego). Dodatkowe punkty, jeśli możesz to naprawić. – Sorpigal

+0

Podobał mi się ten, mimo że musisz teraz dwukrotnie wpisać exit, aby zamknąć okno terminala. Jedna poprawa: exec bash -l (tak, że wiersz polecenia jest rozsądny) –

5

Pozwól rozwinąć trochę na ten temat:

Po uruchomieniu skryptu bash tworzy dla niego nowy proces, a zmiany w bieżącym katalogu mają wpływ tylko na ten proces.

Po wygenerowaniu skryptu skrypt jest wykonywany bezpośrednio przez uruchomioną powłokę, bez tworzenia dodatkowych procesów, dlatego zmiany w bieżącym katalogu są widoczne dla głównego procesu powłoki.

Tak, jak Ignacio zauważył, to nie może być zrobione

0

Można zdefiniować funkcję uruchamiania w bieżącej powłoki na poparcie tego. Na przykład.

md() { mkdir -p "$1" && cd "$1"; } 

mam powyżej w moim ~/.bashrc

+1

Co to ma wspólnego z pytaniem? – mob

+1

@mob Pozwala użytkownikom zdefiniować szybki sposób zmiany katalogu na określony/zmienny, co najprawdopodobniej oznaczało cel zapytania i kolejne wyszukiwania.+1 – BroSlow

1

Jeśli naprawdę potrzebujesz to zachowanie, można dokonać zwrotu skrypt katalogu, a następnie użyć go jakoś. Coś jak:

#!/bin/bash 
cd /tmp 
echo $(pwd) 

a następnie można

cd $(./script.sh) 

brzydki, ale załatwia sprawę w tym prostym przypadku.

+0

Zgadzam się - jeśli użytkownik NAPRAWDĘ tego potrzebuje i nie może tego osiągnąć poprzez funkcję w funkcji .bashrc, najbliższą rzeczą byłoby uruchomienie zewnętrznego skryptu, a następnie cd do tego, co było zwroceniem JEDNAKU - to oznacza, że ​​zewnętrzny skrypt nie może mieć jakąkolwiek interakcję z użytkownikiem, ponieważ zużywasz wszystkie dane wyjściowe. Dlatego odpowiedź Williama wydaje się nieco bardziej elastyczna. mayEb stderr może być użyty - naprawdę potrzebujesz więcej szczegółów od użytkownika na temat użycia – nhed

1

Oto głupi pomysł. Użyj PROMPT_COMMAND. Na przykład:

 
$ export PROMPT_COMMAND='test -f $CDFILE && cd $(cat $CDFILE) && rm $CDFILE' 
$ export CDFILE=/tmp/cd.$$ 

, następnie wykonuje ostatnią linię skryptu być „pwd> $ CDFILE”

Powiązane problemy