com bash
ou zsh
:
unset -v password # make sure it's not exported
set +o allexport # make sure variables are not automatically exported
IFS= read -rs password < /dev/tty &&
printf '{"username":"myname","password":"%s"}\n' "$password" | cmd
Sem IFS=
, read
removeria os espaços em branco iniciais e finais da senha digitada.
Sem -r
, ele processaria as barras invertidas como um caractere de citação.
Você quer ter certeza de que só lê o terminal.
echo
não pode ser usado de forma confiável. Em bash
e zsh
, printf
está embutido para que a linha de comando não seja mostrada na saída de ps
.
Em bash
, você precisa citar $password
, caso contrário, o operador split + glob será aplicado a ele.
Isso ainda está errado, já que você precisa codificar essa string como JSON. Por exemplo, aspas duplas e barras invertidas, pelo menos, seriam um problema. Você provavelmente precisa se preocupar com a codificação desses caracteres. Seu programa espera seqüências de caracteres UTF-8? O que o seu terminal envia?
Para adicionar uma string de prompt, com zsh
:
IFS= read -rs 'password?Please enter a password: '
com bash
:
IFS= read -rsp 'Please enter a password: ' password