Come modificare il PERCORSO all'interno di uno script di shell?


28

Ho diversi progetti che mi richiedono di cambiare le versioni di Java / Grails / Maven. Sto cercando di gestirlo con alcuni script che potrebbero apportare le modifiche. Per esempio:

#!/bin/sh

export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
export PATH=$JAVA_HOME/bin:$PATH
export GRAILS_HOME=/cygdrive/c/dev/grails-1.0.3
export PATH=$GRAILS_HOME/bin:$PATH
export MAVEN_HOME=/cygdrive/c/dev/apache-maven-2.0.11
export PATH=$MAVEN_HOME/bin:$PATH
which java
which grails
which mvn

Quando questo viene eseguito, cambia correttamente il PERCORSO nel contesto dello script, ma lo script termina e non è stata apportata alcuna modifica.

Come posso eseguire uno script in modo da cambiare il PERCORSO per la shell in cui sto attualmente lavorando?

Sto usando Cygwin.

Risposte:


39

Devi usare sourceoo evalspawnare una nuova shell.

Quando si esegue uno script di shell, viene generata una nuova shell figlio . Questa shell figlio eseguirà i comandi di script. L' ambiente shell padre rimarrà intatto da qualsiasi cosa accada nella shell figlio .

Esistono molte tecniche diverse per gestire questa situazione:

  1. Preparare un file sorgente file contenente un elenco di comandi sourcenella shell corrente:

    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    

    e quindi fonte

    source sourcefile

    si noti che non è necessario uno sha-bang all'inizio del file sorgente , ma funzionerà con esso.

  2. Preparare uno script evalfile.sh che stampa il comando per impostare l'ambiente:

    #!/bin/sh
    echo "export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22"
    echo "export PATH=$JAVA_HOME/bin:$PATH"
    

    e poi evalusalo:

    eval `evalfile.sh`
  3. Configurare ed eseguire una nuova shell:

    #!/bin/sh
    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    
    exec /bin/bash
    

    nota che quando scrivi exitquesta shell, tornerai a quella padre .

  4. Inserisci un alias nel tuo ~/.bashrc:

    alias prepare_environ='export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22; export PATH=$JAVA_HOME/bin:$PATH;'

    e chiamalo quando necessario:

    prepare_environ

1
Ho notato che sourcefunziona solo per bash. Uscita per ksh: /bin/ksh: source: not foundper sh: sh: 0: source: not found. La risposta seguente dovrebbe essere considerata per queste shell.
Danny Lo,

@dannylo, hai ragione ma la domanda è chiaramente bashcentrata.
andcoz,

L'esportazione è richiesta con $ PATH, che presumibilmente esiste già?
Esskov,

@esskov di solito non lo è. Ricordo solo una vecchia versione di sh su AIX che lo richiedeva (circa 1992) ma, probabilmente, era una specie di bug.
Andcoz,

19

Puoi farlo usando il sorgente incorporato:

. script_name

Alcune shell forniscono un alias chiamato source :

source script_name

-1

installato Chocolatey @ unix, puoi semplicemente eseguire RefreshEnv per ottenere variabili d'ambiente aggiornate nella sessione corrente

dettaglio


1
Anche la domanda che hai collegato (e le sue risposte) riguarda Windows.   Questa domanda riguarda Unix e Linux, quindi il tuo post non risponde a questa domanda.
G-Man dice 'Reinstate Monica' il

installato Chocolatey @ unix
小 色狼

OK, affermi che questa risposta funziona per Unix. Il tuo link ai dettagli è ancora irrilevante. Fornisci dettagli su come funziona in Unix. I collegamenti a documenti autorevoli sarebbero buoni, ma non pubblicare solo collegamenti; inserisci le informazioni pertinenti nella tua risposta. ... Per favore non rispondere nei commenti; modifica la tua risposta per renderla più chiara e completa.
G-Man dice "Reinstate Monica" l'
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.