Używać powłoki Linux , jak uruchomić program z innym katalogiem roboczym niż bieżący katalog roboczy?
Na przykład mam plik binarny, helloworld
który tworzy plik hello-world.txt
w bieżącym katalogu .
Ten plik znajduje się w katalogu /a
.
Obecnie jestem w katalogu /b
. Chcę uruchomić mój program ../a/helloworld
i znaleźć hello-world.txt
gdzieś w trzecim katalogu /c
.
linux
shell
environment
Anton Daneyko
źródło
źródło
su
resetuje katalog roboczy do katalogu domowego użytkownika określonego przed uruchomieniem jakichkolwiek-c
poleceń. To było dla mnie bardzo pomocne.Odpowiedzi:
Wywołaj program w następujący sposób:
Nawiasy powodują odrodzenie podpowłoki. Ta podpowłoka następnie zmienia katalog roboczy na
/c
, a następnie wykonujehelloworld
z/a
. Po wyjściu z programu podpowłoka kończy działanie, co powoduje powrót do monitu powłoki nadrzędnej w katalogu, w którym został uruchomiony.Obsługa błędów: Aby uniknąć uruchamiania programu bez zmiany katalogu, np. W przypadku błędnej pisowni
/c
, wykonajhelloworld
warunek:Zmniejszenie zużycia pamięci: aby uniknąć marnowania pamięci podpowłoki podczas wykonywania hello world, zadzwoń
helloworld
przez exec:[Podziękowania dla Josha i Juliano za udzielenie wskazówek na temat poprawy tej odpowiedzi!]
źródło
Podobne do odpowiedzi Davida Schmitta oraz sugestii Josha, ale nie pozostawia uruchomionego procesu powłoki:
Ten sposób jest bardziej podobny do tego, jak zwykle uruchamiasz polecenia w powłoce. Aby zobaczyć praktyczną różnicę, musisz uruchomić
ps ef
z innej powłoki z każdym rozwiązaniem.źródło
Opcja, która nie wymaga podpowłoki i jest wbudowana w bash
Próbny:
źródło
pushd SOME_PATH && run_stuff && popd
- jeśli run_stuff zawiedzie, to popd nie zostanie wykonany.set -e
pliku, a wtedy nie będziepopd
.pushd "${SOME_PATH}" && run_stuff; popd
jest lepsza niż obecna odpowiedź, ponieważ semantyka pushd / popd została zaprojektowana specjalnie do tej sytuacji, gdy wchodzę do jakiegoś katalogu, a potem wracam do pierwotnego.źródło
Zawsze uważam, że narzędzia UNIX powinny być zapisywane jako filtry, czytać dane wejściowe ze standardowego wejścia i zapisywać dane wyjściowe na standardowe wyjście. Jeśli to możliwe, możesz zmienić swój plik binarny helloworld, aby zapisywał zawartość pliku tekstowego na standardowe wyjście, a nie na określony plik. W ten sposób możesz użyć powłoki, aby zapisać plik w dowolnym miejscu.
$ cd ~ / b
$ ~ / a / helloworld> ~ / c / helloworld.txt
źródło
Po prostu zmień ostatnie „&&” na „;” i odeśle CD bez względu na to, czy polecenie zakończy się niepowodzeniem, czy pomyślnie:
źródło
Jednym ze sposobów jest utworzenie skryptu powłoki opakowania.
Skrypt powłoki zmieniłby bieżący katalog na / c, a następnie uruchomił / a / helloworld. Po zakończeniu skryptu powłoki bieżący katalog powraca do / b.
Oto przykładowy skrypt powłoki bash:
źródło
dlaczego nie uprościć tego
cd SOME_PATH && run_some_command && cd -
ostatnia komenda „cd” zabierze cię z powrotem do ostatniego katalogu pwd. Powinno to działać na wszystkich systemach * nix.
źródło
run_some_command
zawiedzie,cd -
nie zostanie wykonane.Jeśli zawsze chcesz, aby przechodził do / C, użyj bezwzględnej ścieżki podczas zapisywania pliku.
źródło
Jeśli chcesz to zrobić w swoim programie, zrobiłbym coś takiego:
źródło
z bieżącego katalogu podaj pełną ścieżkę do katalogu skryptów, aby wykonać polecenie
źródło