mainThe GNU Bourne-Again SHell - Support: sr #109052, if export builtin is pipelined the...

 
 

sr #109052: if export builtin is pipelined the export will fail

Submitter:  None
Submitted:  Fri 27 May 2016 07:54:19 AM UTC
   
 
Category:  None Priority:  5 - Normal
Severity:  2 - Minor Status:  Invalid
Privacy:  Public Assigned to:  None
Originator Email:  -email is unavailable- Open/Closed:  Open
Operating System:  GNU/Linux
* Mandatory Fields

Add a New Comment Rich Markup
   

Wed 03 Aug 2016 08:01:47 PM UTC, comment #1: 

Pipeline elements are run in subshells, and those subshells cannot affect their parent's environment.  The only exception is the last element of a pipeline when job control is not enabled and the `lastpipe' option is enabled.

Chet Ramey <chet>
Group administrator
Fri 27 May 2016 07:54:19 AM UTC, original submission:  

To reproduce:
   
    $ export MYVAR="myvalue" | tee /dev/null
    $ echo "${MYVAR}"

    $

The first question a reader may ask is "Why do you want to pipe and export when it does not output any data?"

This was discovered in a testing script that read a list of pre-processing setup commands from a configuration.  The output of each setup command was added to the test log.  An example test setup might be:

  wget http://example.com/binaries.tar.gz
  tar xzvf binaries.tar.gz
  export PATH=$PATH:./binaries

In this use case, the PATH was being modified during setup to add older binaries for a migration test using code like this:

    for preprocessingCommand in "${preprocessingCommands[@]}"; do
      echo "Running: ${preprocessingCommand}" | tee -a "${logOutputFile}"
      eval "${preprocessingCommand}" 2>&1 | tee -a "${logOutputFile}"
    done

I was able to change the code to work around this issue...

    for preprocessingCommand in "${preprocessingCommands[@]}"; do
      echo "Running: ${preprocessingCommand}" | tee -a "${logOutputFile}"
      # if export builtin is piped it will fail
      if [[ "${preprocessingCommand}" == export ]]; then
        eval "${preprocessingCommand}"
      else
        eval "${preprocessingCommand}" 2>&1 | tee -a "${logOutputFile}"
      fi
    done

If this is documented somewhere,  I was unable to find it.

Note: I have also noticed the same behavior with other builtins such as 'cd'

Anonymous

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach Files:
   
   
Comment:
   

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by chet (Posted a comment)
  • -email is unavailable- added by None (Submitted the item)
  •  

    There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

    Only logged-in users can vote.

     

    Follows 1 latest change.

    Date Changed by Updated Field Previous Value => Replaced by
    2016-08-03 chet StatusNone Invalid

    Back to the top

    Powered by Savane 3.13-f8d8.
    Corresponding source code