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?
bash
shell
working-directory
Marty Wallace
źródło
źródło
Odpowiedzi:
W tym celu możesz użyć
cd
wbudowanego lub wbudowanegopushd
ipopd
. 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.
źródło
cd -
powłoka POSIX, aby wrócić do poprzedniego katalogu. To powiedziawszy, (a)pushd
ipopd
są naprawdę przeznaczone do użytku interaktywnego oraz (b) nie zawsze można bezpiecznie założyć, że możeszcd
wró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 /… ).popd
.:
oznacza tutaj symbol?man bash
odczytów:: [arguments]
Brak efektu; polecenie nie robi nic poza rozwijaniem argumentów i wykonywaniem określonych przekierowań. Status zwrotu wynosi zero.Użyj
cd
w 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.
źródło
\
po każdym;
dla poleceń wielowierszowych w tym samym kontekście.(cd /path/to/your/special/place;/bin/your-special-command ARGS)
źródło
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;
current_dir
równą Twojemupwd
cd
w którym musisz wykonać poleceniecd
wrócimy do naszej zmiennejcurrent_dir
Inne rozwiązanie autorstwa @apieceofbart
pushd && YOUR COMMAND && popd
źródło
pushd && YOUR COMMAND && pulld
popd
zamiastpulld
.