Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.
Модератор: Bizdelnick
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:
Сообщение
serzh-z » 27.09.2018 14:20
Есть ли какой-то штатный и красивый способ сделать так, чтобы после `read -s` выводился NL? Кроме как самостоятельно печатать '\n' после `read`?
Хотелось бы, чтобы 'bar' было на другой строке:
Shell
$ read -p 'foo: ' -s; echo 'bar'
foo: bar
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 27.09.2018 14:55
read -p 'foo: ' -s; echo -e '\nbar'
Да, я не дочитал первый абзац до конца.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:
Сообщение
Hephaestus » 27.09.2018 15:01
serzh-z писал: ↑ 27.09.2018 14:20
Хотелось бы, чтобы 'bar' было на другой строке:
Убрать
-s ?
Насколько я понял,
-s подавляет echo.
А echo по дефолту (без опции
-n ) делает перевод на другую строку.
Вывод: чтобы добиться перевода на новую строку, надо не подавлять echo, то есть убрать опцию
-s
Shell
read -p 'foo: '; echo 'bar'
foo:
bar
Это, конечно, при условии, что я всё верно понял.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:
Сообщение
serzh-z » 27.09.2018 17:44
Нет и нет.
echo - это для примера. Там что угодно может быть, я его не контроллирую.
`-s`, разумеется, там не просто так - мне нужно ввести пароль и подавить эхо ввода (при этом не хочется выносить read из условия if и не хочется добавлять печать NL в каждую ветку if/else).
Может какая-нибудь переключалка в терминале есть, типа "печатать NL после закрытия stdin или после сброса режима подавленного эха"?
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 27.09.2018 17:54
serzh-z писал: ↑ 27.09.2018 17:44
echo - это для примера. Там что угодно может быть, я его не контроллирую.
То есть тебе нужно повлиять на поведение кем-то написанного скрипта, не трогая его, я правильно понял?
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:
Сообщение
serzh-z » 27.09.2018 18:35
Bizdelnick
Shell
if read -p 'Password: ' -s; then
# blah
fi
# blah
И внутри if и вне него любое приложении может что-то вывести.
Меня интересует, не умеет ли read самостоятельно печатать NL после своей работы в тихом режиме.
Мне не хочется вставлять печать NL перед blah и вообще добавлять лишние строки.
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 27.09.2018 18:44
serzh-z писал: ↑ 27.09.2018 18:35
Меня интересует, не умеет ли read самостоятельно печатать NL после своей работы в тихом режиме.
Насколько мне известно, и насколько я понимаю из
man bash-builtins (а другие реализации read и опции -s и -p понимать не обязаны), нет.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:
Сообщение
Hephaestus » 27.09.2018 21:37
serzh-z писал: ↑ 27.09.2018 18:35
Мне не хочется вставлять печать NL перед blah и вообще добавлять лишние строки.
Ещё нагуглился вариант добавить перевод строки прямо в приглашение.
Выглядит примерно так:
Shell
read -p "Password: `echo $'\n '`" -s; echo bar
Password:
bar
Идея взята
здесь .
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 27.09.2018 23:35
Вообще несколько надуманная проблема — почему не вставить ещё echo? Хочешь красивее — напиши функцию:
Код: Выделить всё
readpassword() {
old_stty_=$( stty -g )
stty -echo
printf "password: "
read "$@"
printf '\n'
stty $old_stty_
}
Ещё и переносимо будет.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:
Сообщение
serzh-z » 28.09.2018 08:07
Bizdelnick писал: ↑ 27.09.2018 23:35
почему не вставить ещё echo?
По задумке - это читабельный "однострочник" с минимумом переносов.
P.S.: насчёт собственного read выше - для полного соответствия встроенной версии нужно еще отключать echok и echonl.
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 28.09.2018 14:15
serzh-z писал: ↑ 28.09.2018 08:07
для полного соответствия встроенной версии нужно еще отключать echok и echonl.
А может достаточно просто не отключать echonl? Я не проверял, честно говоря, как оно себя ведёт.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:
Сообщение
serzh-z » 28.09.2018 14:48
Bizdelnick
Нет, уже попробовал.
Фиг с ним, все равно пришлось превратить в полноценный скрипт, куда не страшно воткнуть печать NL.