Variables value gets lost in subshell

10,341

The issue here is that using while in a pipeline creates a subshell, and a subshell cannot affect its parent. You can get around this in a few ways. For what you are doing now, this will suffice:

for JAR in *; do
    # Your stuff
done

Another thing to note is that you shouldn't rely on parsing ls

This also shows you ways to avoid the subshell.

Share:
10,341
stacker
Author by

stacker

Data Explorer English

Updated on June 04, 2022

Comments

  • stacker
    stacker almost 2 years

    This bash script concatenates the names for jar files to a classpath (variable CP), in the while loop the value is correct but is lost in the subshell as descibed in this related question Bash variable scope

    #!/bin/bash
    CP="AAA"
    func() {
            ls -1 | while read JAR
            do
                    if [ ! -z "$CP" ]; then
                            CP=${CP}':'
                    fi
                    CP=${CP}${JAR}
            done
            echo $CP # <-- prints AAA
    }
    
    func
    

    My question is, since I can't figure out which element will be the last one, how can the value be saved.

    Do I actually have to save the current value (repeatedly in the loop) to a file?

    EDIT:

    A colleague came up with this command sequence which works well

    ls | xargs echo|tr ' ' :