Zsh: тайм-аут для встроенной функции vared

Два портативных(ksh, zsh, bash )решения AFAICT:

 typeset -p arr >./file              # save array
../file                            # read array

И

printf '%q\n' "${arr[@]}" >./file    # save array
eval "arr=( $(<./file) )"           # read array

Обратите внимание, что первое решение создаст локальную переменную, если она используется внутри функции в bash.

2
04.02.2020, 15:25
1 ответ

Вы можете сделать что-то вроде:

default=foobar
if
  command=$(
    saved_settings=$(stty -g)
    trap 'stty $saved_settings; exit 1' ALRM
    v=
    TMOUT=10 vared -p "Enter a command [$default]: " v &&
      printf %s $v
  )
then
  command=${command:-$default}
  printf 'Got: "%s"\n' $command
else
  print timeout
fi

Вместо заполнения переменной значением по умолчанию мы замещаем ее пустой строкой и устанавливаем для нее значение по умолчанию только в том случае, если переменная остается пустой после возврата vared.

Чтобы обработать тайм-аут, мы используем специальную переменную $TMOUTв подоболочке, которая вызывает zleвыход из этой подоболочки через $TMOUTсекунд.

Это 10-секундный глобальный тайм-аут. Другим подходом может быть использование тайм-аута между символами терминальной строки -,(stty time xс x, выраженным в децисекундах ), чтобы дать пользователю достаточно времени для ввода большой команды, но таймаут истекает, скажем, через 3 секунды. бездействие:

default=foobar
if
  command=$(
    saved_settings=$(stty -g)
    trap 'stty $saved_settings' EXIT INT TERM ALRM
    zle-line-init() stty -icanon time 30 min 0 <&2
    zle -N zle-line-init
    v=
    vared -p "Enter a command [$default]: " v &&
      printf %s $v
  )
then
  command=${command:-$default}
  printf 'Got: "%s"\n' $command
else
  print
  print timeout
fi

Обратите внимание, что хотя они и работают в сценариях, в настоящее время они не работают в интерактивных оболочках, так как varedони отказываются работать в подоболочках. Если вам нужно запустить это из интерактивной оболочки, пока это не будет исправлено в zsh, вы можете изменить:

command=$(
 ...
)

К

command=$(default=$default zsh -c '
 ...
')
1
28.04.2021, 23:24

Теги

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