sh
(como na especificação da linguagem sh
) não vem com um editor de linhas. Os drivers de terminal têm um editor de linha rudimentar que permite backspace e algumas outras teclas para editar a linha inserida, mas geralmente não são chaves de flecha.
Você pode inserir um valor padrão no buffer de entrada do driver de terminal usando TIOCSTI
ioctl como:
printf 'Please enter the value: '
value=the-default
perl -MPOSIX -e 'require "sys/ioctl.ph"; tcflush 0,2;
ioctl(STDIN, &TIOCSTI, $_) or die "$!\n"
for split "", join " ", @ARGV' "$value"
IFS= read -r value
Após o read
, o conteúdo de $value
( the-default
) será inserido como se digitado.
Agora, se você quiser um editor de linha mais avançado, como o fornecido por libreadline
, onde você pode usar as teclas de seta, você pode usar coisas como rlwrap
(não um comando padrão):
value=the-default
value=$(rlwrap -S 'Please enter the value: ' -P "$value" -o cat)
rlwrap
é normalmente usado para adicionar editores de linha como readline
a aplicativos que não possuem um. Acima, estamos adicionando um editor de linha a cat
e usando-o no modo one-shot ( -o
), para que cat
retorne após uma linha ser inserida (embora ainda seja possível inserir mais de uma linha com < kbd> Ctrl + V , Ctrl-J como em bash
.
Se você estiver pronto para usar shells não padrão, zsh
ou bash
têm recursos internos para isso usando seu próprio editor de linhas.
Em zsh
:
value=the-default
vared -p 'Please enter the value: ' value
Em bash
:
value=the-default
IFS= read -re -i "$value" -p 'Please enter the value: ' value