2008-11-13 14 views
6

To może być zbyt ogólne pytanie, jakie jest, ale ... Jestem zaskoczony, próbując przejść przez katalogi z poziomu skryptu powłoki. Nie jestem * nix power user, ale czuję się komfortowo, pracując z wiersza poleceń dla większości zadań. Chciałbym wywołać skrypt, który może poruszać się „ja” do katalogu zamiast sprawiedliwego procesu skrypt podobny do następującego:Skrypty powłoki Bash: jaka prosta logika mi brakuje

prompt:> goto lit 

gdzie goto jest aliasem ->goto='./goscript'
i
goscript ma jakiś prosty kod w takich jak:

cd /path to work dirs/lit/user dir 

(przy założeniu, że każdy użytkownik ma wewnątrz katalogu/świeci)

mam unikać sam ten problem, ustawiając mój osobisty alias ", aby przejść do żądanego katalogu, uruchomić skrypt, a następnie powrócić do pierwotnego katalogu. To pytanie zadał mi współpracownik, który stosuje podobną metodę, ale chciał, aby proces był bardziej ogólny, więc nie musimy tworzyć wszystkich potrzebnych nam aliasów. Pomyślałem, że będzie to łatwy problem do rozwiązania, ale jestem zdumiony, ponieważ nie mam zbyt wiele doświadczenia z skryptami powłoki ... jak na razie.

+0

Zobacz http://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script –

Odpowiedz

2

Nie możesz. Skrypt ma swoją własną kopię środowiska, więc nie może zmienić środowiska powłoki logowania.

0

Nie można użyć cd w skrypcie basha. Można jednak aliasować ścieżkę CD i ścieżkę.

alias goto='cd /path_to_work/usr/dir' 

UPDATE: by umieścić tę linię w pliku .bashrc, a następnie wykonaj

source ~/.bashrc 

aby utworzyć alias.

0

Możesz wykonać kilka prostych rzeczy, takich jak ten, używając aliasu. Na przykład mam kilka aliasów, które wprowadzają mnie w środowisko przestrzeni roboczej i konfiguruję zmienne dla naszego systemu Makefile. Oto prawdziwy alias, którego używam jako przykładu. '& &' będzie kontynuował wykonywanie poleceń, dopóki jeden z nich nie ulegnie awarii - w prostych scenariuszach, takich jak ten, nie jest potrzebne czyszczenie, ponieważ awaria jest mało prawdopodobna.

alias main1='cd ~/code/main1 && export TOP=`pwd` && export DEBUG=1' 

Jeśli chcesz rozwijać wspólną bibliotekę aliasów wśród swoich współpracowników, można je udostępniać poprzez NFS i źródło pliku, które należy uwzględnić.

0

Każdy skrypt ma swój własny pomysł na bieżący katalog roboczy. "cd" nie jest procesem, ale wbudowanym powłoką.

Sposób na zrobienie tego, co chcesz, to utworzenie aliasu. W csh będzie to coś jak:

alias goto 'cd /path_to_work/\!*/user_dir' 

sh/bash mają podobne wyposażenie alias

5

Można utworzyć funkcję, która jest wywoływana goto (lub cokolwiek) i upewnij się, że jest zdefiniowana w .bashrc (lub możesz "pobrać" go z bieżącej powłoki):

function goto { 
    # the "$USER" part will expand to the current username 
    # the "$1" will expand to the first argument to the function ("goto xyz" => $1 is "xyz") 
    cd /some-path/lit/$USER/$1 
} 

Umieść to w ~ /.bashrc lub w osobnym pliku i nazwać „pozyskać plik” ze swoją szybka następnie można wywołać funkcję tak jak każdy inny program:

prompt> goto folder 
cd /some-path/lit/your-user/folder 
4

na wykonanie skryptu w tym samym środowisku swojego wiersza trzeba wywołaj to przy pomocy.

Powiedzmy, że masz skrypt o nazwie up:

cd .. 

jeśli powoływania go. otrzymasz:

$> pwd 
$> /home/users/rd/proj 
$> . up 
$> pwd 
$> /home/users/rd 
+0

Kropka jest w rzeczywistości odpowiednikiem polecenia "source". Chociaż przynajmniej w moim systemie muszę napisać "./up" zamiast po prostu ". Up" - w przeciwnym razie dostanę błąd: "bash: ELF: command not found" –

+0

Masz rację co do źródła. Powodem, dla którego popełniłeś błąd, jest to, że go nie masz. na ścieżce. Jest to domyślne zachowanie (którego powód całkiem zrozumiałem) dla wielu powłok uniksowych. –

+0

@ Remo.D: powodem jest bezpieczeństwo. Zapewnia to, że przypadkowo nie wykonasz polecenia z bieżącego katalogu zamiast "prawdziwego" polecenia. Wyobraź sobie skrypt powłoki w twoim katalogu domowym o nazwie "ls", którego zawartość to "rm -rf /" –

0

staram się mieć kilka tuzinów aliasy w moim .RC które wyglądają tak:

alias work='cd /home/foo/work' 
alias rails='cd /home/foo/rails' 
alias assets='cd /home/foo/rails/assets' 

itp

Jeśli to nie będzie pracować dla Ciebie , możesz być w stanie użyć haków do debugowania w bashu, aby zastąpić linię poleceń w miejscu przed jej wykonaniem - jeśli słowo kluczowe "goto" jest pierwszą rzeczą na linii. Będzie to polegało na szukaniu "pułapki" w bashu, ale uprzedzajcie, że takie zaklęcia nie zachowują się tak samo na wszystkich systemach. Kilka miesięcy temu napisałem o jednym z takich doświadczeń i zapraszam na the results.

9

Jeszcze lepiej niż przy użyciu aliasu opisanego przez innych, sprawdź zmienną CDPATH! Jest to zasadniczo odpowiednik funkcji PATH, ale jest stosowany do polecenia cd.

Na przykład, jeśli mogę określić moje CDPATH jak $CDPATH:${HOME}/subdir i ~/subdir zawiera inny katalog, subsubdir, to mogę po prostu wykonać:

cd subsubdir 

z dowolnego katalogu, a poruszać się ścieżką, jak oczekiwano.

Oto kilka specyfika:

http://www.caliban.org/bash/#bashtips

ustawić zmienną CDPATH, dodaj linię do .bashrc, takie jak

export CDPATH=$CDPATH:${HOME}/subdir 
+0

+1 za użycie odpowiedniego narzędzia do zadania ...coś, czego próbuję uczyć moje dzieci, które zdają się myśleć, że wszystko jest młotem. –

+0

Ponadto, jeśli cenisz sobie zdrowy rozsądek, upewnij się, że pierwszy znak w wartości CDPATH to ":", więc gdy wpiszesz "cd bin" i tam jest katalog bin w bieżącym katalogu, to właśnie tam się znajdujesz. –

1

nie byłem członkiem kiedy zapytałem to (ironicznie moje anonimowe pytanie logowania ma wyższy poziom niż moje oficjalne pytania logowania połączone), więc nie mogę tego teraz zamknąć - Ale- The Remo D. et al. odpowiedź byłaby tą, która doprowadziła do rozwiązania roboczego, którego potrzebowaliśmy. Jeśli ktokolwiek z uprawnieniami do modyfikacji może zamknąć tę &, wybierz tę opcję jako zaakceptowaną odpowiedź, a następnie aprobuję ją.