Hi all, I’ve recently moved to zsh as Apple is pressuring us :) My problem is that I have built a little bash script thing to work as a buildbot for some projects I’m building snapshots for. My two problems are that my error control is no longer working in a way that it stops (exit 1) after encountering an error when in bash emulation mode, and that if I deactivate the bash emulation stuff doesn’t work. My scripts can be found at https://github.com/DominusExult/buildbot , as an example I’ve shortened in this email my exult snapshot.sh and my functions script functions.sh. Something goes wrong in the error(), pipestatus() and teelog() functions, I guess. But I can’t quite tell and I’ve built that script 5 years ago and am a bit rusty to what each of those function do exactly. What I expect is that when the script runs into an error it stops, even if the error happens in one of the functions but currently the script goes on and on. This used to work before in bash. If I get rid of the —emulate sh, my variables don’t get passed on correctly (the error I get in the shorted version of my script is "configure: error: unrecognized option: `-q --disable-data --with-macosx-static-lib-path=/opt/i386/lib’” I hope you can help me figure this out. I’ve tried researching this on my own but the biggest hurdle was that search results pointed me at bash stuff and not zsh. Thank you, Dom The scripts: exultsnasphot.sh: #!/bin/zsh --emulate sh #functions . ./functions.sh headermain EXULT cd ~/code/snapshots/exult /usr/bin/git pull --rebase=true 2> >(teelog >&2) || error Git pull #i386 ARCH=i386 SDK=10.11 DEPLOYMENT=10.7 flags gcc CONF_ARGS="-q --disable-data --with-macosx-static-lib-path=/opt/$ARCH/lib" autogen build 2>&1 | teelog -a ; pipestatus || return deploy { #make fat exult binary lipo -create -arch arm64 exult_arm64 -arch x86_64 exult_x86_64 -arch i386 exult_i386 -output exult || error lipo } 2>&1 | teelog -a ; pipestatus || return functions.sh: #-------------headers------------- headermain() { if [ "$1" != "" ]; then TARGET=$1 #lowercase of $TARGET target="$(echo $TARGET | tr '[A-Z]' '[a-z]')" #logfile LOGFILE=~/.local/logs/${target}built.txt else error headermain function fi } alias deploy='echo -e "$(tput setab 4)$(tput bold)$(tput setaf 3)\tdeployment\t$(tput sgr 0)"' #-------------Error handling------------- alias lockfile='rm -f ~/.local/"$TARGET"build1.lockfile' error () { if [ "$?" != "0" ]; then if [ "$2" != "" ]; then local i2=" $2" fi if [ "$3" != "" ]; then local i3=" $3" fi echo -e "$(tput setab 1)$(tput bold)$(tput setaf 7)\t${1:-"Unknown Error"}${i2}${i3} failed!\t\t$(tput sgr 0)" 1>&2 lockfile exit 1 fi } pipestatus() { local S=("${PIPESTATUS[@]}") if test -n "$*" then test "$*" = "${S[*]}" else ! [[ "${S[@]}" =~ [^0\ ] ]] fi } teelog() { tee $1 $LOGFILE } #-------------compiler & flags------------- flags() { SYSARCH=$(uname -m) if [ "$ARCH" = "" ] && [ "$SYSARCH" = "arm64" ]; then ARCH=arm64 SDK=11.0 DEPLOYMENT=11.0 elif [ "$ARCH" = "" ] && [ "$SYSARCH" = "x86_64" ]; then ARCH=x86_64 SDK=10.14 DEPLOYMENT=10.11 fi export PKG_CONFIG_PATH=/opt/$ARCH/lib/pkgconfig export PKG_CONFIG=/opt/$SYSARCH/bin/pkg-config if [ "$ARCH" = "i386" ]; then OPTARCH='-arch i386 -m32 -msse -msse2 -O2 ' elif [ "$ARCH" = "ppc" ]; then OPTARCH='-arch ppc -m32 -O2 ' export PKG_CONFIG=/opt/x86_64/bin/pkg-config elif [ "$ARCH" = "x86_64" ]; then OPTARCH='-m64 -msse -msse2 -O2 ' elif [ "$ARCH" = "arm64" ]; then OPTARCH='-O2 ' fi OPT=' -w -force_cpusubtype_ALL '$OPTARCH SDK=' -isysroot /opt/SDKs/MacOSX'$SDK'.sdk -mmacosx-version-min='$DEPLOYMENT' ' export MACOSX_DEPLOYMENT_TARGET=$DEPLOYMENT export CPPFLAGS='-I/opt/'$ARCH'/include'$SDK export CFLAGS='-I/opt/'$ARCH'/include'$SDK' '$OPT export CXXFLAGS='-I/opt/'$ARCH'/include '$SDK' '$OPT export LDFLAGS='-L/opt/'$ARCH'/lib'$SDK' '$OPT export LIBTOOLFLAGS=--silent } gcc() { if [ "$ARCH" != "" ]; then export PATH=/opt/$ARCH/bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin export LD="/usr/bin/ld" export RANLIB="~/code/sh/tools/ranlib" if [ "$1" = "legacy" ]; then export PATH=/opt/$ARCH/bin/:/opt/xcode3/usr/bin:/opt/xcode3/usr/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin export CC='/opt/xcode3/usr/bin/llvm-gcc-4.2 -arch '$ARCH export CXX='/opt/xcode3/usr/bin/llvm-g++-4.2 -arch '$ARCH export LD="/opt/xcode3/usr/bin/ld" export RANLIB="/opt/xcode3/usr/bin/ranlib.old" elif [ "$1" = "oldgcc" ]; then export PATH=/opt/$ARCH/bin/:/opt/xcode3/usr/bin:/opt/xcode3/usr/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin export CC='/opt/xcode3/usr/bin/gcc-4.2 -arch '$ARCH export CXX='/opt/xcode3/usr/bin/g++-4.2 -arch '$ARCH export LD="/opt/xcode3/usr/bin/ld" export RANLIB="/opt/xcode3/usr/bin/ranlib.old" else export CC='/usr/bin/clang -arch '$ARCH export CXX='/usr/bin/clang++ -arch '$ARCH fi else error gcc function fi } #-------------command shortcuts------------- alias autogen='./autogen.sh > /dev/null 2>&1' alias makes='make clean > /dev/null ; make -j9 -s AR="~/code/sh/tools/ar" > /dev/null || error $HEADER make' config() { if [ "$CONF_OPT" != "" ]; then c1=$CONF_OPT fi if [ "$CONF_ARGS" != "" ]; then c2=$CONF_ARGS fi if [ "$ARCH" = "ppc" ]; then ./configure --host=powerpc-apple-darwin $CONF_OPT $CONF_ARGS || error $ARCH configure elif [ "$ARCH" = "i386" ]; then ./configure --host=i386-apple-darwin $CONF_OPT $CONF_ARGS || error $ARCH configure elif [[ "$ARCH" = "arm64" ]] && [[ "$SYSARCH" != "arm64" ]]; then ./configure --host=arm-apple-darwin $CONF_OPT $CONF_ARGS || error $ARCH configure elif [[ "$ARCH" = "x86_64" ]] && [[ "$SYSARCH" != "x86_64" ]]; then ./configure --host=x86_64-apple-darwin $CONF_OPT $CONF_ARGS || error $ARCH configure else [ "$?" != "0" ] ./configure $CONF_OPT $CONF_ARGS || error $ARCH configure fi } stripp() { if [ "$ARCH" != "" ]; then strip $1 -o $1_$ARCH || error $HEADER strip else strip $1 -o $1 || error $1 strip fi } build() { config makes stripp $target }