Czy istnieje POSIX (lub przynajmniej popularne) narzędzie do ustawiania bieżącego katalogu roboczego podczas wywoływania programu?

20

Mamy env (1), aby zmodyfikować środowisko polecenia, które chcemy uruchomić (na przykład env MANPAGER=more man dtrace). Czy istnieje coś podobnego do modyfikacji katalogu, w którym polecenie ma zostać uruchomione?

Idealnie chciałbym, aby wyglądało to tak:

theMagicCommand /new/cwd myProgram

W ten sposób można go „powiązać” z innymi poleceniami podobnymi do env (1), np.

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

Do tej pory mogę wymyślić następujące rozwiązanie, które niestety nie ma tego samego interfejsu co env (1):

cd /new/cwd && myProgram

Ponadto mogę po prostu utworzyć prosty skrypt powłoki:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

ale szukam czegoś, co już istnieje (przynajmniej na macOS i FreeBSD).

myProgramniekoniecznie jest aplikacją komputerową (w takim przypadku mógłbym po prostu użyć klucza Path w pliku .desktop ).

Mateusz Piotrowski
źródło
6
Dlaczego cd /new/cwd && env VAR=value myProgramnie spełnia twoich kryteriów?
jpaugh
To już pytanie, w którym M. Piotrowski wyjaśnił, że to nie ten sam interfejs co env. Patrzeć env. Porównaj to do rtprio, idprio, numactl, jexec, chrt, a nawet poleceń z zestawów narzędzi wymienionych w odpowiedziach. Jest wzór i ładowanie łańcucha.
JdeBP,
3
Co rozumiesz przez „interfejs”? A dlaczego nie użyć (cd the/cwd; cmd)?
Konrad Rudolph,
2
@KonradRudolph Na przykład, nie można łatwo przejść (cd the/cwd; cmd)do env (1) bez owijania go sh (1).
Mateusz Piotrowski,

Odpowiedzi:

19

AFAIK, w skrzynce narzędzi POSIX nie ma takiego dedykowanego narzędzia. Ale często wywołuje shsię konfigurację środowiska (cwd, limity, stdout / in / err, umask ...) przed uruchomieniem polecenia, tak jak w shskrypcie.

Ale nie musisz pisać tego skryptu w pliku, możesz go po prostu wstawić:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(zakładając, że katalog nie jest -). Dodawanie CDPATH=(jeśli jest w środowisku) i -Paby działało bardziej jak strit chdir().

Alternatywnie możesz użyć, perlktóry chdir()robi prosto chdir()z pudełka.

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args
Stéphane Chazelas
źródło
O tak. Jest to bardzo przydatna odmiana skryptu, którą zawarłem w moim pytaniu. Obawiałem się, że narzędzie, którego szukam, nie istnieje, ponieważ jego funkcjonalność jest już dostępna z relatywnie krótkim oneliner sh (1).
Mateusz Piotrowski
8
Jeśli już biegniesz sh, możesz to zrobić (cd /wherever && exec /my/command). ()Domyślnie otwiera podpowłoce aby uruchomić zapakowane polecenia, oczywiście, execpozbywa dodatkowego procesu powłoki tak szybko jak /my/commandzaczyna biec.
jpaugh
2
Zasugerowano to w usuniętej teraz odpowiedzi. Pytający wyjaśnił, że nie była to odpowiedź na pytanie Xe.
JdeBP,
15

Zestawy narzędzi używane w świecie Daemontools i innych miejscach mają to i jeszcze więcej; od wielu lat; i są szeroko dostępne.

  • Sprawca Wayne'a Marshalla ma runtool:

    runtool -c / new / cwd myProgram
  • Linia wykonawcza Laurenta Bercot'a ma cd:

    cd / new / cwd myProgram
  • mój zestaw narzędzi nosh ma chdir:

    chdir / new / cwd myProgram

Wszystkie są narzędziami do ładowania łańcucha, zaprojektowanymi do użycia w dokładnie takich łańcuchach. W tych zestawach narzędzi znajduje się szeroki wybór narzędzi do ładowania łańcucha do innych celów.

Dalsza lektura

JdeBP
źródło
11

Istnieje tak popularny program. To się nazywa ... trzymać krzesła ... drumroll ... env. Wersja GNU, ponieważ wersja 8.28, a nie POSIX, ma -Copcję, która pozwala ustawić katalog tak, jak potrzebujesz:

    NAZWA
           env - uruchom program w zmodyfikowanym środowisku

    STRESZCZENIE
           env [OPCJA] ... [-] [NAZWA = WARTOŚĆ] ... [POLECENIE [ARG] ...]

    OPIS
           Ustaw dla każdej NAZWY wartość WARTOŚĆ w środowisku i uruchom polecenie KOMEND.

           Obowiązkowe argumenty dla długich opcji są obowiązkowe również dla krótkich opcji.

           -i , --ignore-environment
                  zacznij od pustego środowiska

           -0 , - zero
                  zakończ każdą linię wyjściową wartością NUL, a nie nową linią

           -u , --unset = NAZWA
                  usuń zmienną ze środowiska

           -C , --chdir = DIR
                   zmień katalog roboczy na DIR

           --help wyświetl tę pomoc i zakończ

           --wersja
                  wyświetla informacje o wersji i kończy działanie

           Zwykłe - implikuje -i . Jeśli nie ma POLECENIA, wydrukuj powstałe środowisko.

n. „zaimki” m.
źródło
Fajnie, chociaż nie jest dostępny od razu po zakupie na macOS i FreeBSD.
Mateusz Piotrowski,
1

Niektóre programy mają taką opcję, na przykład Git:

-C <path>

Uruchom tak, jakby gitzostał uruchomiony w <path>zamiast bieżącego katalogu roboczego.

i zrób:

-C dir, --directory=dir

Przejdź do katalogu, dirzanim przeczytasz pliki makefiles lub zrobisz cokolwiek innego.

i smoła:

-C, --directory=DIR

Zmień na DIRprzed wykonaniem jakichkolwiek operacji. Ta opcja uwzględnia wielkość zamówień, tzn. Wpływa na wszystkie następujące opcje.

Steven Penny
źródło
Tak. Chociaż moje pytanie brzmi: co, jeśli myProgramnie zapewnia takiej możliwości ... Dziękuję za wkład, ale obawiam się, że w ogóle nie odpowiada na moje pytanie.
Mateusz Piotrowski,