I was talking about prince. Since (as OP found out) Jenkins had cleared PATH environment variable, and (supposedly) there was no prince executable in the current directory (or the script was running on a UNIX-like system where executables are not run from current directory unless $PATH contains .), OP thought that open($fh, "|-", "prince ...") should have failed, but it didn't because there was a $Config{sh} between Perl and prince in the process tree.