Can I export a variable to the environment from a bash script without sourcing it?

前端 未结 7 1762
半阙折子戏
半阙折子戏 2020-11-22 05:51

Suppose that I have this script

export.bash:

#! /usr/bin/env bash
export VAR=\"HELLO, VARIABLE\"

When I execute th

7条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-22 06:46

    In order to export out the VAR variable first the most logical and seems working way is to source the variable:

    . ./export.bash
    

    or

    source ./export.bash
    

    Now when echoing from main shell it works

     echo $VAR
    HELLO, VARABLE
    

    We will now reset VAR

    export VAR=""
    echo $VAR
    

    Now we will execute a script to source the variable then unset it :

    ./test-export.sh 
    HELLO, VARABLE
    --
    .
    

    the code: cat test-export.sh

        #!/bin/bash
        # Source env variable
        source ./export.bash
    
        # echo out the variable in test script
        echo $VAR
    
        # unset the variable 
        unset VAR
        # echo a few dotted lines
        echo "---"
        # now return VAR which is blank
        echo $VAR
    

    Here is one way

    PLEASE NOTE: The exports are limited to the script that execute the exports in your main console - so as far as a cron job I would add it like the console like below... for the command part still questionable: here is how you would run in from your shell:

    On your command prompt (so long as the export.bash has multiple echo values)

    IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
    HELLO THERE
    HI THERE
    

    cat v1.sh

    #!/bin/bash
    echo $VAR
    echo $VAR1
    

    Now so long as this is for your usage - you could make the variables available for your scripts at any time by doing a bash alias like this:

    myvars ./v1.sh
    HELLO THERE
    HI THERE
    
    echo $VAR
    
    .
    

    add this to your .bashrc

    function myvars() { 
        IFS=$'\n'; 
        for entries in $(./export.bash); do  export $entries;  done; 
    
        "$@"; 
    
        for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
    done
    
    }
    

    source your bashrc file and you can do like above any time ...

    Anyhow back to the rest of it..

    This has made it available globally then executed the script..

    simply echo it out then run export on the echo !

    cat export.bash

    #!/bin/bash
    echo "VAR=HELLO THERE"
    

    Now within script or your console run:

     export "$(./export.bash)"
    

    Try:

    echo $VAR
    HELLO THERE
    

    Multiple values so long as you know what you are expecting in another script using above method:

    cat export.bash

    #!/bin/bash
    echo "VAR=HELLO THERE"
    echo "VAR1=HI THERE"
    

    cat test-export.sh

    #!/bin/bash
    
    IFS=$'\n'
    for entries in $(./export.bash); do
       export $entries
    done
    
    echo "round 1"
    echo $VAR
    echo $VAR1
    
    for entries in $(./export.bash); do
         variable=$(echo $entries|awk -F"=" '{print $1}');
         unset $variable
    done
    
    echo "round 2"
    echo $VAR
    echo $VAR1
    

    Now the results

     ./test-export.sh 
    round 1
    HELLO THERE
    HI THERE
    round 2
    
    
    .
    

    and the final final update to auto assign read the VARIABLES:

    ./test-export.sh 
    Round 0 - Export out then find variable name - 
    Set current variable to the variable exported then echo its value
    $VAR has value of HELLO THERE
    $VAR1 has value of HI THERE
    round 1 - we know what was exported and we will echo out known variables
    HELLO THERE
    HI THERE
    Round 2 - We will just return the variable names and unset them 
    round 3 - Now we get nothing back
    

    The script: cat test-export.sh

    #!/bin/bash
    
    IFS=$'\n'
    echo "Round 0 - Export out then find variable name - "
    echo "Set current variable to the variable exported then echo its value"
    for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     export $entries
     eval current_variable=\$$variable
     echo "\$$variable has value of $current_variable"
    done
    
    
    echo "round 1 - we know what was exported and we will echo out known variables"
    echo $VAR
    echo $VAR1
    
    echo "Round 2 - We will just return the variable names and unset them "
    for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
    done
    
    echo "round 3 - Now we get nothing back"
    echo $VAR
    echo $VAR1
    

提交回复
热议问题