Como faço para enviar uma sugestão para um usuário aceitar e usar como entrada?

5

O que posso fazer para deixar o cursor na mesma linha da sugestão em um script Bash?

Versão do Bash = 3.2.51

Seu objetivo é sugerir uma string para que o usuário apenas pressione Enter.

#!/bin/sh
echo "@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@"
echo "our-platform-7.26-2.17-res4"
read SuggestDefaultPlatform

echo "Stored name: " ${SuggestDefaultPlatform}

que solicita:

@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@ 
our-platform-7.26-2.17-res4
_

onde o sublinhado " _ " representa o cursor.

Eu não quero usar uma solução lógica "Y / n", atribuindo um valor padrão à variável " SuggestDefaultPlatform "

SuggestDefaultPlatform='our-platform-7.26-2.17-res4';

e, em seguida, faça uma pergunta como:

Are you okay with ''our-platform-7.26-2.17-res4'' as your platform name? [Y/n]...

Em vez disso, o usuário pode querer alterar apenas alguns dígitos de uma sugestão solicitada e pressionar Enter. Veja abaixo o cursor " _ " no final da variável " SuggestDefaultPlatform ":

@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@ 
our-platform-7.26-2.17-res4_

para que o usuário possa mover o cursor, modificar a sugestão e / ou pressionar Enter.

our-platform-7.26-2.17-res_
our-platform-7.26-2.17-re_
our-platform-7.26-2.17-r_
our-platform-7.26-2.17-_
our-platform-7.26-2.17_
our-platform-7.26-2.1_
our-platform-7.26-2.18-alpha1_

Pressione Enter.

que solicita:

Stored name: our-platform-7.26-2.18-alpha1
    
por Mauro 15.02.2014 / 10:31

4 respostas

3

Você deseja usar bash em vez de sh e as opções -e e -i de seu read builtin:

#!/bin/bash -
echo "@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@"
read -i "our-platform-7.26-2.17-res4" -e SuggestDefaultPlatform

echo "you chose $SuggestDefaultPlatform"

De help read em bash :

  -i text   Use TEXT as the initial text for Readline
  -e        use Readline to obtain the line in an interactive shell

Assim, o -i define o valor padrão e o -e permite que você insira outro ou modifique-o. Você não precisa do echo extra.

    
por 15.02.2014 / 14:53
3

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
    
por 15.02.2014 / 15:02
2

Resposta curta: use o sinalizador -n para o eco.

Resposta ligeiramente melhor: O comportamento padrão echo é imprimir cada argumento como padrão, seguido por um caractere de nova linha. Esses caracteres são especiais porque você não os vê, pois são uma maneira básica de representar a formatação de saída. Todos os tipos existem para guias, novas linhas, retornos, etc.

Seria extremamente tedioso se não tivéssemos uma maneira fácil de informar nosso shell quando quiséssemos inserir itens como guias ou novas linhas. Para superar isso, o eco define certos caracteres com escape para ter um significado especial. \n significa nova linha e \t significa produzir um caractere de guia [link] .

No exemplo a seguir, você pode ver isso em ação. Eu usei tr que traduz caracteres de um conjunto para outro. A saída mostrará um - em todos os lugares em que encontrou uma nova linha:

echo "Hello\nFriends" | tr "\n" "-"
Hello\nFriends-

Observe que encontramos uma nova linha no final, já que ela foi adicionada automaticamente por echo . Agora, podemos usar -e para desativar esse comportamento. Observe que não há nenhum traço no final:

echo -en "Hello\nFriends" | tr "\n" "-"
Hello\nFriends

Se você quiser que echo imprima o significado das seqüências de escape (como \n acima), use -e :

echo -e "Hello\nFriends"
Hello
Friends
    
por 15.02.2014 / 12:30
2

As versões mais recentes de bash (acredito que pelo menos v4) podem usar readline input e prefill text.

read -e -p "> " -i "our-platform-7.26-2.17-res4" SuggestDefaultPlatform

Se o bash 4 não estiver disponível, eu uso rewrap * para isso. A opção -P permite que você preencha o texto da linha.

SuggestDefaultPlatform=$(rlwrap -P "our-platform-7.26-2.17-res4" bash -c 'echo -n "> "; read response; echo $response')

Em ambos os casos, o usuário pode simplesmente pressionar enter para aceitar o valor ou editar a linha antes de enviá-la. Será assim:

> our-platform-7.26-2.17-res4_

Onde _ é o cursor. Você pode fazer backup até o o , mas o > permanecerá como um prompt e não poderá ser substituído. Apenas o texto após o prompt está na variável.

* rlwrap pode precisar ser instalado também.

    
por 15.02.2014 / 22:12