Вы можете написать "счетчик тайм-аута" в функцию, и если она завершится первой, это уничтожит скрипт, иначе будет уничтожена сама функция.
run_tout_counter() {
sleep 10 & wait
echo timeout
rm /tmp/toutPID
kill -s SIGINT $processPID
}
export processPID=$$
run_tout_counter & echo $! > /tmp/toutPID
read -p "type input:" A && ps $(cat /tmp/toutPID) >/dev/null
excode=$?
if [[ $excode == 0 ]] ; then kill -s SIGINT $(cat /tmp/toutPID) ; fi && rm /tmp/toutPID
Как муру написал в комментарии,что-то использует конвейер и, таким образом, перезаписывает pipestatus
, вероятно, в автоматизации, связанной с подсказкой -. Наиболее вероятным виновником является ловушка-функция , такая как precmd
и preexec
¹.
Баш-сейвы $?
, PIPESTATUS
и куча других вещей вокруг ловушек иPROMPT_COMMAND
(save_parser_state
). Zsh сохраняет $?
в ряде случаев (в источнике , ищите места, которые сохраняют lastval
), в том числе вокруг расширения подсказки(promptexpand
)и запуска хуков, таких как precmd
иpreexec
(callhookfunc
вызываетdoshfunc
с помощью noreturnval=1
), но никогда не сохраняет pipestatus
.
¹ Код в подсказке также может устанавливать переменные, еслиprompt_subst
установлен, но канал будет в подоболочке и не перезапишет pipestatus
исходной оболочки.