Параметр -s
read
не определен в стандарте POSIX.См. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html. Я хотел что-то, что будет работать для любой оболочки POSIX, поэтому я написал небольшую функцию, которая использует stty
для отключения эха.
#!/bin/sh
# Read secret string
read_secret()
{
# Disable echo.
stty -echo
# Set up trap to ensure echo is enabled before exiting if the script
# is terminated while echo is disabled.
trap 'stty echo' EXIT
# Read secret.
read "$@"
# Enable echo.
stty echo
trap - EXIT
# Print a newline because the newline entered by the user after
# entering the passcode is not echoed. This ensures that the
# next line of output begins at a new line.
echo
}
Эта функция ведет себя очень похоже на read
команда.Вот простое использование read
с последующим аналогичным использованием read_secret
.Ввод в read_secret
кажется пустым, поскольку он не был передан на терминал.
[susam@cube ~]$ read a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
Вот еще один, который использует опцию -r
для сохранения обратной косой черты на входе.Это работает, потому что определенная выше функция read_secret
передает все полученные аргументы команде read
.
[susam@cube ~]$ read -r a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret -r a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
Наконец, вот пример, который показывает, как использовать функцию read_secret
для чтенияпароль в режиме POSIX.
printf "Password: "
read_secret password
# Do something with $password here ...