Asynchronous jobs are tricky. For now, we disable them behind a flag in [set]. $ msh -c "echo hello &" You are using asynchronous operators and [set -o async] has not been called. [1] But we do have some support for them. $ cat > msh.sh << EOF > set -o async > sleep 10000 & echo hello > kill -9 \$! > EOF $ cat > test.sh << EOF > sleep 10000 & echo hello > kill -9 \$! > EOF $ sh test.sh hello $ msh msh.sh hello