2010-01-25 15 views
15

Chcę wykonać polecenie takie jak 'git tag -l' wewnątrz katalogu/home/user/git/app /, ale w rzeczywistości jestem w/dom/użytkownik. Jak mogę to zrobić w bashu bez zmiany katalogu roboczego?Jak wykonać polecenie z określonego katalogu bez faktycznej zmiany w tym katalogu?

więc nie:

cd /home/user/git/app && git tag -l 

dlatego, że faktycznie zmienia mój katalog roboczy i trzeba zrobić 'cd/home/user' ponownie.

+0

jest cd - tak trudno wpisać, co innego patrzeć na to iść-narzędzia http: // code.google.com/p/go-tool/ –

+1

znajduje się wewnątrz skryptu. nie ma nic wspólnego z leniwością. – primeminister

Odpowiedz

0

spróbować użyć

cd - 

po wszystko jest zrobione. To polecenie służy do powrotu do ostatniego katalogu roboczego.

4

Jeśli dana komenda zawsze będzie poleceniem git, powinieneś po prostu użyć opcji --git-dir i --work-tree, aby powiedzieć git, co robić! (Lub jeśli robisz to bardzo często w trakcie wykonywania skryptu, ustaw zmienne GIT_DIR i GIT_WORK_TREE na odpowiednie ścieżki)

Jeśli to ogólne pytanie, uważam, że Andrzej ma początek w najlepszej propozycji: użyj podpowłoki. Właściwym sposobem na rozpoczęcie podpowłoce jest jednak to, aby użyć nawiasów, aby nie używać podstawienia polecenia (chyba, że ​​faktycznie chcą uchwycić wyjście):

(cd $dir && run_command) 

Innym rozwiązaniem, jak sugeruje Felix i ibread, będzie oczywiście działa, ale bądź ostrożny - jeśli polecenie, które wykonujesz, jest prawdopodobnie funkcją powłoki, to może również cd, a na końcu zmienić efekt cd -. Najbezpieczniejszą rzeczą w ogólnym przypadku jest najpierw przechowywanie bieżącego katalogu w zmiennej.

+0

Jest to głównie polecenie git, więc jest jedno i drugie. Dzięki za podpowiedź na GIT_DIR! – primeminister

+0

W ten sposób wszystkie polecenia skryptowe git działają wewnętrznie (przynajmniej w bieżącym git) - dziedziczą ustawienia GIT_DIR i GIT_WORK_TREE z komendy wywołania git, a następnie komendy git, które następnie wywołują, dziedziczą z nich. – Cascabel

1

Być może zechcesz zrobić coś w stylu: (cd /home/user/git/app && git tag -l). Spowoduje to utworzenie nowej powłoki i wykonanie poleceń w powłoce bez zmiany powłoki. Możesz to sprawdzić, wykonując następujące czynności:

$ echo $OLDPWD 
/Users/daveshawley 
$ (cd/&& ls) 
... 
$ echo $OLDPWD 
/Users/daveshawley 
+2

Mimo to sugerowałbym używanie '&&' zamiast ';', jeśli używasz zmiennej dla katalogu, więc może ona nie istnieć, a polecenie przerwałoby (lub, co gorsza, zepsuło to). – Cascabel

5

Oto inne rozwiązanie: użyć PUSHD zmienić katalog, a następnie POPD powrotu:

pushd /home/user/git/app && git tag -l; popd 
+0

Gdy chcesz uruchomić polecenie gdzieś indziej bez zmiany katalogu roboczego, 'pushd' /' popd' są zdecydowanie drogą do zrobienia. – bta

+0

Nie chciałbyś używać '&&' zamiast średnika przed 'popd'? W przeciwnym razie możesz znaleźć się w trzecim katalogu. –

+0

Jedyny problem z podejściem 'pushd' /' popd' polega na tym, że może on utracić informacje, takie jak zmienna środowiskowa 'OLDPWD'.Lepiej nie tupiąc środowiska użytkownika i po prostu uruchom w podpowłoce. –

Powiązane problemy