1*13de33a5SJulio MerinoIFS=, 2*13de33a5SJulio Merino 3*13de33a5SJulio MerinoSPECIAL="break,\ 4*13de33a5SJulio Merino :,\ 5*13de33a5SJulio Merino continue,\ 6*13de33a5SJulio Merino . /dev/null,\ 7*13de33a5SJulio Merino eval,\ 8*13de33a5SJulio Merino exec,\ 9*13de33a5SJulio Merino export -p,\ 10*13de33a5SJulio Merino readonly -p,\ 11*13de33a5SJulio Merino set,\ 12*13de33a5SJulio Merino shift,\ 13*13de33a5SJulio Merino times,\ 14*13de33a5SJulio Merino trap,\ 15*13de33a5SJulio Merino unset foo" 16*13de33a5SJulio Merino 17*13de33a5SJulio Merino# If there is no command word, the shell must abort on an assignment error. 18*13de33a5SJulio Merino${SH} -c "readonly a=0; a=2; exit 0" 2>/dev/null && exit 1 19*13de33a5SJulio Merino 20*13de33a5SJulio Merino# Special built-in utilities must abort on an assignment error. 21*13de33a5SJulio Merinoset -- ${SPECIAL} 22*13de33a5SJulio Merinofor cmd in "$@" 23*13de33a5SJulio Merinodo 24*13de33a5SJulio Merino ${SH} -c "readonly a=0; a=2 ${cmd}; exit 0" 2>/dev/null && exit 1 25*13de33a5SJulio Merinodone 26*13de33a5SJulio Merino 27*13de33a5SJulio Merino# Other utilities must not abort; we currently still execute them. 28*13de33a5SJulio Merino${SH} -c 'readonly a=0; a=1 true; exit $a' 2>/dev/null || exit 1 29*13de33a5SJulio Merino${SH} -c 'readonly a=0; a=1 command :; exit $a' 2>/dev/null || exit 1 30