2

I am trying to install OpenFoam on ubuntu bash on Win 10. I am following these steps: OpenFoam installation on win 10 Ubuntu bash

at this step

source $HOME/.bashrc

I get the following error:

-bash: eval: line 38: syntax error near unexpected token `('
-bash: eval: line 38: `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program:Files:(x86)/Common:Files/Oracle/Java/javapath_target_275852031:/mnt/c/Windows/System32:/mnt/c/DAYSIM/lib:/mnt/c/DAYSIM/bin:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Windows/System32/OpenSSH:Files/Microsoft:SQL:Server/120/Tools/Binn:Files/Common:Files/Autodesk:Shared:/mnt/c/Radiance/bin:Server/130/Tools/Binn:Files/dotnet:Server/Client:SDK/ODBC/130/Tools/Binn:(x86)/Microsoft:Server/140/Tools/Binn:Server/140/DTS/Binn:Server/140/Tools/Binn/ManagementStudio:/mnt/c/Users/danie/AppData/Local/Programs/Python/Python36/Scripts:/mnt/c/Users/danie/AppData/Local/Programs/Python/Python36:/mnt/c/Users/danie/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/danie/AppData/Local/Programs/Microsoft:VS:Code/bin:/snap/bin'
-bash: eval: line 62: syntax error near unexpected token `('
-bash: eval: line 62: `PATH=/opt/OpenFOAM/ThirdParty-v1806/platforms/linux64Gcc63/openmpi-1.10.4/bin:/opt/OpenFOAM/ThirdParty-v1806/platforms/linux64/gcc-6.3.0/bin:/home/daniel/OpenFOAM/daniel-v1806/platforms/linux64Gcc63DPInt32Opt/bin:/opt/OpenFOAM/site/v1806/platforms/linux64Gcc63DPInt32Opt/bin:/opt/OpenFOAM/OpenFOAM-v1806/platforms/linux64Gcc63DPInt32Opt/bin:/opt/OpenFOAM/OpenFOAM-v1806/bin:/opt/OpenFOAM/OpenFOAM-v1806/wmake:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program:Files:(x86)/Common:Files/Oracle/Java/javapath_target_275852031:/mnt/c/Windows/System32:/mnt/c/DAYSIM/lib:/mnt/c/DAYSIM/bin:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Windows/System32/OpenSSH:Files/Microsoft:SQL:Server/120/Tools/Binn:Files/Common:Files/Autodesk:Shared:/mnt/c/Radiance/bin:Server/130/Tools/Binn:Files/dotnet:Server/Client:SDK/ODBC/130/Tools/Binn:(x86)/Microsoft:Server/140/Tools/Binn:Server/140/DTS/Binn:Server/140/Tools/Binn/ManagementStudio:/mnt/c/Users/danie/AppData/Local/Programs/Python/Python36/Scripts:/mnt/c/Users/danie/AppData/Local/Programs/Python/Python36:/mnt/c/Users/danie/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/danie/AppData/Local/Programs/Microsoft:VS:Code/bin:/snap/bin:'
-bash: eval: line 38: syntax error near unexpected token `('
-bash: eval: line 38: `PATH=/opt/OpenFOAM/ThirdParty-v1806/platforms/linux64Gcc63/gperftools-2.5/bin:/opt/OpenFOAM/ThirdParty-v1806/platforms/linux64Gcc63/openmpi-1.10.4/bin:/opt/OpenFOAM/ThirdParty-v1806/platforms/linux64/gcc-6.3.0/bin:/home/daniel/OpenFOAM/daniel-v1806/platforms/linux64Gcc63DPInt32Opt/bin:/opt/OpenFOAM/site/v1806/platforms/linux64Gcc63DPInt32Opt/bin:/opt/OpenFOAM/OpenFOAM-v1806/platforms/linux64Gcc63DPInt32Opt/bin:/opt/OpenFOAM/OpenFOAM-v1806/bin:/opt/OpenFOAM/OpenFOAM-v1806/wmake:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program:Files:(x86)/Common:Files/Oracle/Java/javapath_target_275852031:/mnt/c/Windows/System32:/mnt/c/DAYSIM/lib:/mnt/c/DAYSIM/bin:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Windows/System32/OpenSSH:Files/Microsoft:SQL:Server/120/Tools/Binn:Files/Common:Files/Autodesk:Shared:/mnt/c/Radiance/bin:Server/130/Tools/Binn:Files/dotnet:Server/Client:SDK/ODBC/130/Tools/Binn:(x86)/Microsoft:Server/140/Tools/Binn:Server/140/DTS/Binn:Server/140/Tools/Binn/ManagementStudio:/mnt/c/Users/danie/AppData/Local/Programs/Python/Python36/Scripts:/mnt/c/Users/danie/AppData/Local/Programs/Python/Python36:/mnt/c/Users/danie/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/danie/AppData/Local/Programs/Microsoft:VS:Code/bin:/snap/bin'

I don't understand what is happening here. Any help would be appreciated.

The OpenFoam bashrc codes are as follows:

#----------------------------------*-sh-*--------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
#------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, licensed under GNU General Public License
#     <http://www.gnu.org/licenses/>.
#
# File
#     etc/bashrc
#
# Description
#     The OpenFOAM environment for POSIX shell (eg, bash,dash,zsh,...).
#     Source manually or from the ~/.bashrc or ~/.profile files.
#
#     Many settings can be overridden using a <prefs.sh> file:
#
#       - Base values (eg, from system admin):
#         -  $WM_PROJECT_DIR/etc/prefs.sh
#
#       - User or group values (first file found):
#         -  ~/.OpenFOAM/$WM_PROJECT_VERSION/prefs.sh
#         -  ~/.OpenFOAM/prefs.sh
#         -  $WM_PROJECT_SITE/site/$WM_PROJECT_VERSION/prefs.sh
#         -  $WM_PROJECT_SITE/site/prefs.sh
#
# Note: Changes made to this bashrc file may be lost with the next upgrade.
#------------------------------------------------------------------------------

export WM_PROJECT=OpenFOAM
export WM_PROJECT_VERSION=v1806

# [FOAM_INST_DIR] - parent directory containing the OpenFOAM installation.
# \- When this file is located as $WM_PROJECT_DIR/etc/bashrc, the next lines
#    should work when sourced by BASH or ZSH shells. If this however fails,
#    set one of the fallback values to an appropriate path.
# --
rc="${BASH_SOURCE:-${ZSH_NAME:+$0}}"
[ -n "$rc" ] && FOAM_INST_DIR=$(\cd $(dirname $rc)/../.. && \pwd -L) || \
FOAM_INST_DIR=$HOME/$WM_PROJECT
# FOAM_INST_DIR=/opt/$WM_PROJECT
# FOAM_INST_DIR=/usr/local/$WM_PROJECT
#
# END OF (NORMAL) USER EDITABLE PART
################################################################################
: # Extra safety - if the user commented out all fallback values
unset rc

# Configuration environment variables.
# Should override via <prefs.sh> file instead of editing this file.

# [WM_COMPILER_TYPE] - Compiler location:
# = system | ThirdParty
export WM_COMPILER_TYPE=ThirdParty

# [WM_COMPILER] - Compiler:
# = Gcc | Gcc4[8-9] | Gcc5[1-5] | Gcc6[1-4] | Gcc7[1-3] | Gcc8[1] | GccKNL |
#   Clang | Clang3[7-9] | Clang[4-6]0 | Icc | IccKNL | Cray | Arm
export WM_COMPILER=Gcc63

# [WM_ARCH_OPTION] - Memory addressing:
# = 32 | 64
#   * on a 64-bit OS this can be 32 or 64
#   * on a 32-bit OS, it is always 32-bit and this option is ignored
export WM_ARCH_OPTION=64

# [WM_PRECISION_OPTION] - Floating-point precision:
# = DP | SP
export WM_PRECISION_OPTION=DP

# [WM_LABEL_SIZE] - Label size in bits:
# = 32 | 64
export WM_LABEL_SIZE=32

# [WM_COMPILE_OPTION] - Optimised, debug, profiling:
# = Opt | Debug | Prof
export WM_COMPILE_OPTION=Opt

# [WM_MPLIB] - MPI implementation:
# = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPI | MPICH | MPICH-GM |
#   HPMPI | CRAY-MPICH | FJMPI | QSMPI | SGIMPI | INTELMPI | USERMPI
export WM_MPLIB=OPENMPI


#------------------------------------------------------------------------------
# (legacy / advanced)
#
# [FOAM_SIGFPE] - Trap floating-point exceptions.
#               - overrides the 'trapFpe' controlDict entry
# = true | false
#export FOAM_SIGFPE=true

# [FOAM_SETNAN] - Initialize memory with NaN
#               - overrides the 'setNaN' controlDict entry
# = true | false
#export FOAM_SETNAN=false

# [WM_OSTYPE] - Operating System Type:
# = POSIX
#export WM_OSTYPE=POSIX

################################################################################

# Old directories to be cleaned from PATH, LD_LIBRARY_PATH
foamOldDirs="$WM_PROJECT_DIR $WM_THIRD_PARTY_DIR \
    $HOME/$WM_PROJECT/$USER $FOAM_USER_APPBIN $FOAM_USER_LIBBIN \
    $WM_PROJECT_SITE $FOAM_SITE_APPBIN $FOAM_SITE_LIBBIN"

# Location of installation and third-party software
export WM_PROJECT_INST_DIR=$FOAM_INST_DIR
export WM_PROJECT_DIR=$WM_PROJECT_INST_DIR/$WM_PROJECT-$WM_PROJECT_VERSION
export WM_THIRD_PARTY_DIR=$WM_PROJECT_INST_DIR/ThirdParty-$WM_PROJECT_VERSION

# [WM_PROJECT_SITE] - Location of site-specific (group) files
# default (unset) implies WM_PROJECT_INST_DIR/site
if [ -d "$WM_PROJECT_SITE" ]
then
    export WM_PROJECT_SITE
else
    unset WM_PROJECT_SITE
fi

# [WM_PROJECT_USER_DIR] - Location of user files
export WM_PROJECT_USER_DIR=$HOME/$WM_PROJECT/$USER-$WM_PROJECT_VERSION

# Load shell functions
. $WM_PROJECT_DIR/etc/config.sh/functions

# Overrides via <prefs.sh>
_foamEtc -mode=o  prefs.sh      # 1) other (system) values
_foamEtc -mode=ug prefs.sh      # 2) user or group values

# Evaluate command-line parameters and record settings for later.
# These can be used to set/unset values, specify additional files etc.
export FOAM_SETTINGS="$@"
_foamEval $@

# Clean standard environment variables (PATH, MANPATH, LD_LIBRARY_PATH)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
export PATH MANPATH LD_LIBRARY_PATH
_foamClean PATH "$foamOldDirs"
_foamClean MANPATH "$foamOldDirs"
_foamClean LD_LIBRARY_PATH "$foamOldDirs"

# Setup for OpenFOAM compilation etc
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_foamEtc -config  settings

# Setup for third-party packages
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_foamEtc -config  mpi
_foamEtc -config  paraview -- $@        # Pass through for evaluation
_foamEtc -config  vtk
_foamEtc -config  ensight
_foamEtc -config  gperftools
## _foamEtc -config  ADIOS
## _foamEtc -config  ADIOS2
_foamEtc -config  CGAL
_foamEtc -config  scotch
_foamEtc -config  FFTW

# Interactive shell
if /usr/bin/tty -s 2>/dev/null
then
    _foamEtc -config  aliases
    [ "${BASH_VERSINFO:-0}" -ge 4 ] && _foamEtc -config  bash_completion
fi


# Clean environment paths again. Only remove duplicates
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
export PATH MANPATH LD_LIBRARY_PATH

_foamClean PATH
_foamClean MANPATH
_foamClean LD_LIBRARY_PATH

# Add trailing ':' for system manpages
if [ -n "$MANPATH" ]
then
    MANPATH="${MANPATH}:"
fi

if [ -n "$LD_PRELOAD" ]
then
    export LD_PRELOAD
    _foamClean LD_PRELOAD
fi


# Cleanup temporary information
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# Unload shell functions
. $WM_PROJECT_DIR/etc/config.sh/functions

# Variables (done as the last statement for a clean exit code)
unset FOAM_INST_DIR     # Old variable name (OpenFOAM-v1606) - now unneeded
unset cleaned foamOldDirs

#------------------------------------------------------------------------------
  • 1
    That's really awful code. **Really** awful code. Consider running it through http://shellcheck.net/ (along with the function definitions it's sourcing it -- you won't get a full evaluation without them) and filing the output as a bug with the people who produced it. – Charles Duffy Oct 12 '18 at 15:42
  • 1
    ...as a few concrete starting points: `formOldDirs` should be an array, not a string -- that way there's no need for a sigil character (be it whitespace or otherwise) at all. Most of the unquoted expansions need to be quoted to be safe across all possible contents. `$@` needs to be `"$@"` to avoid munging contents being passed through. [BashFAQ #48](http://mywiki.wooledge.org/BashFAQ/048) (*Eval command and security issues*) and [BashFAQ #50](http://mywiki.wooledge.org/BashFAQ/050) (*I'm trying to put a command in a variable, but the complex cases always fail!*) are recommended reading. – Charles Duffy Oct 12 '18 at 16:03
  • 1
    BTW, if you *do* file a bug upstream, it would be helpful to them if it contained a log of execution with `xtrace` enabled so they can see how things break in practice. To do that: `PS4=':${BASH_SOURCE##*/}:$LINENO+' bash -x yourscript`, and capture what it emits on stderr. – Charles Duffy Oct 12 '18 at 16:08
  • 1
    Crossposting: https://askubuntu.com/questions/1083334/openfoam-win-10-ubuntu-bash-installation-fails – Cyrus Oct 13 '18 at 07:34

3 Answers3

1

The answer is how foamCleanPath was using IFS splitting internally (with whitespace) on the PATH. This has now been changed in the current develop branch with changes similar to the last (deleted) answer.

https://develop.openfoam.com/Development/OpenFOAM-plus/commit/0a2768667f4aa0eb02e41ab2a2de72dbf00e4af6

Additionally, OpenFOAM now allows logical instead of physical names for cwd(), which provides an additional means of working around issues when the case directory contains whitespace.

https://develop.openfoam.com/Development/OpenFOAM-plus/commit/b7054272989a0e5fddbaf6dfbdbfb726f7db8539

Mark.O
  • 94
  • 6
0

bash (or your .bashrc) does not cope with $PATH containing unescaped parentheses. Windows by default has C:\Program Files (x86) in its path, and likely this gets translated under the Linux subsystem into /mnt/c/Program Files (x86). Some bad handling then converts that into (for example) /mnt/c/Program:Files:(x86) , and then bash chokes on the parentheses.

If you show the relevant lines of your .bashrc, maybe fixes can be found. Most likely the following will work:

export PATH="$PATH":/some/new/path

instead of

export PATH=$PATH:/some/new/path

Update

As your .bashrc is sourcing another bashrc file, it turns out the problem is with that other bashrc file. That file does not cope with whitespace.

See also

How to add Path with space in bash variable

https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path

Corion
  • 3,855
  • 1
  • 17
  • 27
  • Thanks for the response. Actually, I don't know exactly what is happening. the steps are like these: `echo "source /opt/OpenFOAM/OpenFOAM-v1806/etc/bashrc" >> ~/.bashrc ` `source $HOME/.bashrc ` I'll upload the file. – Daniel Dolatabadi Oct 12 '18 at 15:36
  • Maybe the error is in `/opt/OpenFOAM/OpenFOAM-v1806/etc/bashrc` then. Unix people are clueless when it comes to whitespace in `$PATH` or filenames generally. – Corion Oct 12 '18 at 15:39
  • Heh. People who use `eval` are clueless (a set which certainly does include whoever wrote the script at hand). That's not all "UNIX people" by a long shot. (The number of people who discount reliability bugs that only come up with unusual filenames is a longstanding peeve, but as a UNIX person, I'm not willing to accept them as one of my own -- call it "no true Scotsman"). – Charles Duffy Oct 12 '18 at 15:40
  • I just added the codes within bashrc file to the question. – Daniel Dolatabadi Oct 12 '18 at 15:41
  • I'm sure that @CharlesDuffy will know better how to solve the problem, but I think that the problem is that `_foamClean PATH` does not cope well with whitespace in `$PATH`, as it uses whitespace to delimit the directories itself: `# Old directories to be cleaned from PATH, LD_LIBRARY_PATH foamOldDirs="$WM_PROJECT_DIR $WM_THIRD_PARTY_DIR \ $HOME/$WM_PROJECT/$USER $FOAM_USER_APPBIN $FOAM_USER_LIBBIN \ $WM_PROJECT_SITE $FOAM_SITE_APPBIN $FOAM_SITE_LIBBIN"` – Corion Oct 12 '18 at 15:43
  • 1
    *le sigh*. Yeah. Someone needs to teach these people how to use arrays. That said, fixing a bunch of someone else's code isn't something I'm going to do without being paid. (If someone from the OpenFoam project showed up and asked for *advice* about how to fix it, I'd be glad to offer it, but that's not what's happening here). – Charles Duffy Oct 12 '18 at 15:44
  • ...that said, the spaces aren't even the most immediate problem -- the `eval` is. (The spaces break ability to look up files in locations that have spaces, but that being broken isn't the trigger for the syntax error). – Charles Duffy Oct 12 '18 at 15:46
  • Oh - I thought that "use of `eval`" was a dig against me :) - I hadn't even spotted that this script was using `eval` at all. – Corion Oct 12 '18 at 15:48
  • @Corion I really appreciate your help. Thanks – Daniel Dolatabadi Oct 12 '18 at 15:49
  • @CharlesDuffy I'll tag them at Twitter and make sure they notice your efforts. Thank you for your generous help. – Daniel Dolatabadi Oct 12 '18 at 15:52
  • @Corion, ...it's hidden behind a function sourced in from another file (not included in the question), but yeah. That totally wasn't aimed at you; my apologies. – Charles Duffy Oct 12 '18 at 16:01
0

Thanks to @user10142377 the problem is solved. The codes within foamCleanPath must be replaced with this one:

#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
#    \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
#-------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, licensed under GNU General Public License
#     <http://www.gnu.org/licenses/>.
#
# Script
#     foamCleanPath
#
# Description
#     Usage: foamCleanPath [OPTION] path [filter] .. [filter]
#            foamCleanPath [OPTION] -env=name [filter] .. [filter]
#
#     Prints its argument (which should be a ':' separated path)
#     without the following:
#         - duplicate elements
#         - elements matching the specified filter(s)
#         - inaccessible directories (with the -strip option)
#
# Note
#     - false matches possible when the filter contains '.' (sed regex) etc.
#     - a single composite filter can be passed in. This composite filter
#       is assumed to be delimited by whitespace, colons or semi-colons.
#
# Examples for cleaning the path:
#
#     - Using explicit arguments
#       cleaned=$(foamCleanPath "$PATH" dir1:dir2) && PATH=$cleaned
#
#     - Variable to clean passed as an option
#       cleaned=$(foamCleanPath -env=PATH dir1:dir2) && PATH=$cleaned
#
#     - Using shell evaluation for the output
#       eval $(foamCleanPath -sh=PATH $PATH" dir1:dir2)
#       eval "$(foamCleanPath -sh=PATH -env=PATH dir1:dir2)"
#       eval "$(foamCleanPath -sh-env=PATH dir1:dir2)"
#
#     - Similarly for c-shell
#       eval `foamCleanPath -csh-env=PATH dir1:dir2`
#
#------------------------------------------------------------------------------
usage() {
    cat <<USAGE 1>&2
Usage: foamCleanPath [OPTION] path [filter] .. [filter]
       foamCleanPath [OPTION] -env=name [filter] .. [filter]
options:
  -csh=NAME         Produce 'setenv NAME ...' output for csh eval
  -sh=NAME          Produce 'NAME=...' output for sh eval
  -csh-env=NAME     As per -csh, with -env for initial content
  -sh-env=NAME      As per -sh,  with -env for initial content
  -env=NAME         Evaluate NAME to obtain initial content
  -debug            Print debug information to stderr
  -strip            Remove inaccessible directories
  -verbose          Report some progress (input, output, ...)
  -help             Print the usage

Prints its argument (which should be a ':' separated list) cleansed from
  * duplicate elements
  * elements whose start matches one of the filters
  * inaccessible directories (the -strip option)

Exit status
    0  on success
    1  general error
    2  initial value of 'path' is empty

USAGE
    exit 1
}

# Report error and exit
die()
{
    exec 1>&2
    echo
    echo "Error encountered:"
    while [ "$#" -ge 1 ]; do echo "    $1"; shift; done
    echo
    echo "See 'foamCleanPath -help' for usage"
    echo
    exit 1
}

#-------------------------------------------------------------------------------

# Input and outputs
unset dirList shellOutput

# Parse options
unset optDebug optEnvName optStrip optVerbose
while [ "$#" -gt 0 ]
do
    case "$1" in
    -h | -help*)
        usage
        ;;
    -csh=* | -sh=* | -csh-env=* | -sh-env=*)
        name="${1#*=}"
        [ -n "$name" ] || die "Option '$1' missing an ENVNAME"

        # Output prefix
        case "$1" in
        -csh*)
            shellOutput="setenv $name "     # eg, "setenv PATH xyz"
            ;;
        *)
            shellOutput="$name="            # eg, "PATH=xyz"
            ;;
        esac

        # For (-csh-env | -sh-env) also use name for input evaluation
        case "$1" in
        *-env=*)
            optEnvName="$name"
            ;;
        esac
        ;;
    -env=*)
        name="${1#*=}"
        [ -n "$name" ] || die "Option '$1' missing an ENVNAME"
        optEnvName="$name"
        ;;
    -debug)
        optDebug=true
        ;;
    -strip)
        optStrip=true
        ;;
    -verbose)
        optVerbose=true
        ;;
    *)
        break
        ;;
    esac
    shift
done


# Basic checks
if [ -n "$optEnvName" ]
then
    eval "dirList=\$$optEnvName"
elif [ "$#" -ge 1 ]
then
    dirList="$1"
    shift
else
    die "Requires at least one argument, or use the -env option"
fi

[ -n "$dirList" ] || exit 2     # Quick exit on empty 'dirList'

#-------------------------------------------------------------------------------

# Debugging (optional)
if [ -n "$optDebug" ]
then
    printDebug() { while [ "$#" -ge 1 ]; do echo "$1" 1>&2; shift; done; }
else
    printDebug() { true; }      # No-op
fi

# Optional test for directory existence
if [ -n "$optStrip" ]
then
    isDir() { test -d "$1"; }   # Check for directory existence
else
    isDir() { test -n "$1"; }   # Only check for non-zero string
fi

# The "filter ... filterN" may have been passed as a single parameter
# or may contain ':' separators.
# Currently (OCT-2018) also accept split on whitespace too.

oldIFS="$IFS"       # Preserve initial IFS
IFS=':; '           # Split on colon, semicolon, whitespace
set -- $*

if [ -n "$optVerbose" ]
then
    echo "clean: $dirList" 1>&2
    echo "with:  $@" 1>&2
fi

printDebug "input>$dirList<"

# Apply filters via sed. Path and filter cannot contain '?'.
for filter
do
    if [ -n "$filter" ]
    then
        printDebug "remove>$filter<"
        dirList=$(echo "$dirList:" | sed -e "s?${filter}[^:]*:??g")
    fi
done
printDebug "intermediate>$dirList<"

IFS=':'             # Split on colon. No split on whitespace.
set -- $dirList

# Rebuild the list
unset dirList
for dir
do
    printDebug "check>$dir< in $dirList"
    if isDir "$dir"
    then
        # Detect duplicates (ie, dir already in the list)
        duplicate=$(echo ":$dirList:" | sed -ne '\?:'"$dir"':?p')

        if [ -n "$duplicate" ]
        then
            printDebug "duplicate>$dir<"
        else
            dirList="${dirList}${dirList:+:}$dir"
        fi
    fi
done

IFS="$oldIFS"       # Restore initial IFS

printDebug "output>$dirList<"
if [ -n "$optVerbose" ]
then
    echo "output: \"$dirList\"" 1>&2
fi

echo "$shellOutput\"$dirList\""

#------------------------------------------------------------------------------

The file can be found at bin folder within OpenFoam application. This link goes to original discussion within gitlab of OpenFoam.