zsh pipestatus исчезает в следующем приглашении

Вы можете написать "счетчик тайм-аута" в функцию, и если она завершится первой, это уничтожит скрипт, иначе будет уничтожена сама функция.

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
2
15.10.2021, 07:22
1 ответ

Как муру написал в комментарии,что-то использует конвейер и, таким образом, перезаписывает pipestatus, вероятно, в автоматизации, связанной с подсказкой -. Наиболее вероятным виновником является ловушка-функция , такая как precmdи preexec¹.

Баш-сейвы $?, PIPESTATUSи куча других вещей вокруг ловушек иPROMPT_COMMAND(save_parser_state). Zsh сохраняет $?в ряде случаев (в источнике , ищите места, которые сохраняют lastval), в том числе вокруг расширения подсказки(promptexpand)и запуска хуков, таких как precmdиpreexec(callhookfuncвызываетdoshfuncс помощью noreturnval=1), но никогда не сохраняет pipestatus.

¹ Код в подсказке также может устанавливать переменные, еслиprompt_substустановлен, но канал будет в подоболочке и не перезапишет pipestatusисходной оболочки.

2
15.10.2021, 09:55

Теги

Похожие вопросы