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