Jak Bash może wykonać polecenie w innym kontekście katalogu?

96

Mam wspólne polecenie, które jest wywoływane z bardzo określonych katalogów. W / bin znajduje się tylko jeden plik wykonywalny dla tego programu, a bieżący katalog roboczy jest bardzo ważny dla poprawnego uruchomienia go. Skrypt ma wpływ na pliki znajdujące się w katalogu, w którym jest uruchamiany.

Teraz mam również niestandardowy skrypt powłoki, który wykonuje pewne czynności w jednym katalogu, ale muszę wywołać wspomniane powyżej polecenie, jakby znajdowało się w innym katalogu.

Jak to zrobić w skrypcie powłoki?

Marty Wallace
źródło

Odpowiedzi:

39

W tym celu możesz użyć cdwbudowanego lub wbudowanego pushdi popd. Na przykład:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Używasz poleceń wbudowanych tak jak każdego innego polecenia i możesz zmieniać kontekst katalogu tyle razy, ile chcesz w skrypcie.

Todd A. Jacobs
źródło
4
Istnieje również cd -powłoka POSIX, aby wrócić do poprzedniego katalogu. To powiedziawszy, (a) pushdi popdsą naprawdę przeznaczone do użytku interaktywnego oraz (b) nie zawsze można bezpiecznie założyć, że możesz cdwrócić do miejsca, w którym zacząłeś, szczególnie w złożonych podsystemach, które mogą wewnętrznie używać restrykcyjnych uprawnień (patrz stackoverflow.com/questions/ 10555284 /… ).
geekozaur
3
Korzystanie z podpowłoki jest znacznie lepszym rozwiązaniem
josh123a123
W przypadku skryptów podpowłoka jest prawdopodobnie lepszym pomysłem. Jednak bardzo się cieszę, że się o tym dowiem popd.
connorbode
Czy możesz wyjaśnić, co :oznacza tutaj symbol?
Vadim Kotov
2
@VadimKotov Myślę, że to faktycznie nie jest operacja. Odnośna sekcja man bashodczytów: : [arguments]Brak efektu; polecenie nie robi nic poza rozwijaniem argumentów i wykonywaniem określonych przekierowań. Status zwrotu wynosi zero.
boycy
225

Użyj cdw podpowłoce; skróconym sposobem użycia tego rodzaju podpowłoki są nawiasy.

(cd wherever; mycommand ...)

To powiedziawszy, jeśli twoje polecenie ma środowisko, którego wymaga, powinno naprawdę zapewnić to środowisko, zamiast obciążać wszystko, co może chcieć go użyć (chyba że jest to polecenie wewnętrzne używane w bardzo szczególnych okolicznościach w kontekście studni zdefiniowany większy system, tak że każdy dzwoniący musi już zapewnić wymagane środowisko). Zwykle byłby to rodzaj opakowania skryptu powłoki.

geekozaur
źródło
Możesz także wstawić \po każdym ;dla poleceń wielowierszowych w tym samym kontekście.
Chiramisu
Przyczajony tygrys, ukryta najlepsza odpowiedź
użytkownik
37
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
bmargulies
źródło
20

Jeśli chcesz wrócić do bieżącego katalogu roboczego:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Ustawiamy zmienną current_dirrówną Twojemupwd
  2. po tym przejdziemy do miejsca, cdw którym musisz wykonać polecenie
  3. wtedy uruchamiamy polecenie
  4. następnie cdwrócimy do naszej zmiennejcurrent_dir

Inne rozwiązanie autorstwa @apieceofbart pushd && YOUR COMMAND && popd

abc123
źródło
4
lub możesz to zrobićpushd && YOUR COMMAND && pulld
apieceofbart
4
@apieceofbart Myślę, że miałeś na myśli popdzamiast pulld.
Konstantin