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.