Esiste un'utilità POSIX (o almeno una popolare) per impostare la directory di lavoro corrente quando si richiama un programma?


20

Abbiamo env (1) per modificare l'ambiente del comando che vogliamo eseguire (ad esempio env MANPAGER=more man dtrace). Esiste qualcosa di simile, ma per modificare la directory in cui verrà avviato il comando?

Idealmente, vorrei che fosse così:

theMagicCommand /new/cwd myProgram

In questo modo potrebbe essere "incatenato" con altri comandi simili a env (1), ad es.

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

Finora posso pensare alla seguente soluzione, che purtroppo non ha la stessa interfaccia di env (1):

cd /new/cwd && myProgram

Inoltre, posso semplicemente creare un semplice script shell come questo:

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

ma sto cercando qualcosa che esiste già (almeno su macOS e FreeBSD).

myProgramnon è necessariamente un'applicazione desktop (nel qual caso potrei semplicemente usare la chiave Path in un file .desktop ).


6
Perché cd /new/cwd && env VAR=value myProgramnon soddisfa i tuoi criteri?
jpaugh

È già nella domanda, in cui M. Piotrowski ha spiegato che quella non è la stessa interfaccia di env. Guarda env. Confrontarlo rtprio, idprio, numactl, jexec, chrt, e in effetti i comandi nei set di strumenti menzionati nelle risposte. C'è uno schema ed è un caricamento a catena.
JdeBP,

3
Cosa intendi con "interfaccia"? E perché non usarlo (cd the/cwd; cmd)?
Konrad Rudolph,

2
@KonradRudolph Ad esempio, non è possibile passare facilmente (cd the/cwd; cmd)a env (1) senza racchiuderlo con sh (1).
Mateusz Piotrowski,

Risposte:


19

AFAIK, non esiste un'utilità così dedicata nella cassetta degli attrezzi POSIX. Ma è comune invocare la shconfigurazione di un ambiente (cwd, limits, stdout / in / err, umask ...) prima di eseguire un comando come si fa nello shscript.

Ma non devi scrivere quello script in un file, puoi semplicemente inserirlo:

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

(supponendo che la directory non lo sia -). Aggiunta CDPATH=(nel caso ce ne sia una nell'ambiente) e -Pche si comporti più come una scala chdir().

In alternativa, è possibile utilizzare perlchi chdir()fa un chdir()out out of the box.

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args

O si. Questa è una variante molto utile dello script che ho incluso nella mia domanda. Avevo paura che l'utilità che stavo cercando non esistesse poiché la sua funzionalità è già disponibile con un sheleliner relativamente breve.
Mateusz Piotrowski,

8
Se stai già correndo sh, puoi anche farlo (cd /wherever && exec /my/command). La ()apre implicitamente una subshell per eseguire i comandi avvolti, e, naturalmente, execsi libera del processo shell in più nel più breve tempo /my/commandcomincia a correre.
jpaugh

2
Ciò è stato suggerito in una risposta ora cancellata. L'interrogatore ha spiegato che quella non era una risposta a ciò che Xe ha chiesto.
JdeBP,

15

I set di strumenti utilizzati nel mondo dei demoni, e altrove, hanno questo e molto altro; hanno avuto per molti anni; e sono ampiamente disponibili.

Tutti questi sono strumenti di caricamento a catena, progettati per essere utilizzati esattamente in questo tipo di catene. Esiste una vasta selezione di strumenti per il caricamento a catena in questi kit di strumenti per altri scopi.

Ulteriori letture


11

C'è un programma così popolare. Si chiama ... tenere sul vostro sedia ... rullo di tamburi ... env. La versione GNU, dalla versione 8.28, non POSIX, ha l' -Copzione che consente di impostare la directory proprio come richiesto:

    NOME
           env - esegue un programma in un ambiente modificato

    SINOSSI
           env [OPTION] ... [-] [NAME = VALUE] ... [COMMAND [ARG] ...]

    DESCRIZIONE
           Impostare ogni NAME su VALUE nell'ambiente ed eseguire COMMAND.

           Argomenti obbligatori per le opzioni lunghe sono obbligatori anche per le opzioni brevi.

           -i , --ignore-environment
                  iniziare con un ambiente vuoto

           -0 , --null
                  termina ogni riga di output con NUL, non newline

           -u , --unset = NAME
                  rimuovere la variabile dall'ambiente

           -C , --chdir = DIR
                   cambia la directory di lavoro in DIR

           --help visualizza questa guida ed esce

           --versione
                  informazioni sulla versione di output ed uscita

           Un semplice - implica -i . Se nessun COMANDO, stampa l'ambiente risultante.


Fantastico, anche se non è disponibile immediatamente su macOS e FreeBSD.
Mateusz Piotrowski l'

1

Alcuni programmi hanno un'opzione per questo, come Git:

-C <path>

Esegui come se gitfosse stato avviato <path>invece della directory di lavoro corrente.

e fare:

-C dir, --directory=dir

Passa alla directory dirprima di leggere i makefile o fare qualsiasi altra cosa.

e Tar:

-C, --directory=DIR

Passare a DIRprima di eseguire qualsiasi operazione. Questa opzione è sensibile all'ordine, ovvero influenza tutte le opzioni che seguono.


Sì. Anche se la mia domanda è cosa succede myProgramse non offre tale opzione ... Grazie per il tuo contributo, ma temo che non risponda affatto alla mia domanda.
Mateusz Piotrowski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.