# Tests for interactive job control with parameter state %prep if zmodload zsh/zpty 2> /dev/null; then zpty_start() { export PS1= PS2= zpty -d zpty zsh "${(q)ZTST_testdir}/../Src/zsh -fiV +Z" } zpty_input() { zpty -w zsh "${(F)@}" $'\n' } zpty_line() { local REPLY integer i for (( i = 0; i < ${1:-1}; ++i )); do zpty -r zsh REPLY print -r -- ${REPLY%%($'\r\n'|$'\n')} done } zpty_stop() { # exit twice in case of check_jobs zpty -w zsh $'exit\nexit\n' # zpty gives no output when piped without these braces (?) { zpty -r zsh } | sed $'/[^[:space:]]/!d; s/\r$//;' zpty -d : } if ! zmodload zsh/parameter 2> /dev/null; then ZTST_unimplemented='the zsh/parameter module is not available' fi else ZTST_unimplemented='the zsh/zpty module is not available' fi %test zpty_start zpty_input "MODULE_PATH=${(q)MODULE_PATH}" zpty_input 'sleep 3 &' zpty_input 'print $jobstates' zpty_input '(print $jobstates)' zpty_input 'jobs -s' zpty_stop 0:$jobstate for running job in main shell and subshell *>\[1] [0-9]## *>running:+:*=running *>running:+:*=running *>zsh:*SIGHUPed* # $jobstates refers to a job started in the main shell unless # one has been started in the subshell. In the latter case, # the subshell has no job control so the job is not marked as current. zpty_start zpty_input "MODULE_PATH=${(q)MODULE_PATH}" zpty_input 'sleep 3 &' zpty_input '(print main; print $jobstates; sleep 2& print sub; print $jobstates)' zpty_input 'jobs -s' zpty_stop 0:$jobstate shows one job started in main shell or one started in subshell *>\[1] [0-9]## >main *>running:+:*=running >sub *>running::*=running *>zsh:*SIGHUPed* # output from zpty removes empty lines zpty_start zpty_input "MODULE_PATH=${(q)MODULE_PATH}" zpty_input '(print main; print $jobstates; sleep 2& print sub; print $jobstates)' zpty_input 'jobs -s' zpty_stop 0:$jobstate shows no job started in main shell but one started in subshell >main >sub *>running::*=running