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