Два портативных(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.
Вы можете сделать что-то вроде:
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 '
...
')