Использование `read` в сценарии bash из конвейера

ping(1) comprueba la red la conectividad (envía una SOLICITUD DE ECO ICMP -al objetivo y espera una respuesta; tenga en cuenta que algunos "administradores" de red totalmente despistados bloquean ICMP y no obtendrá respuestas incluso si el host es accesible ).

DNS (es decir, host(1)o dig(1)resultados )comprueba si el servidor de nombres para el nombre de host es accesible y responde.

Están totalmente separados, el servidor de nombres generalmente se ejecutará en una máquina diferente, y los RFC incluso exigen que se guarde una copia de los datos en al menos dos servidores en diferentes redes. Por lo tanto, el host puede estar inactivo o ser inaccesible, mientras que el DNS responde. O al revés.

0
25.06.2019, 09:58
1 ответ

readбудет "взаимодействовать" с пользователем через stdin (, где он будет считывать информацию из )и stderr (, где он будет печатать свое приглашение -p, если оно есть ).

Если stdin является скриптом , readполучит от него свои данные, что приведет к пропуску строки:

$ echo '
read foo
what the -)(*$;?
echo "$foo"
' | bash
what the -)(*$;?

Вряд ли это хорошая практика, и она будет работать не во всех оболочках. Также обратите внимание, что при передаче скриптов через stdin bashпридется читать их байт -на -байт.

В вашем примере весь скрипт представлял собой одну строку, поэтому встроенная функция readпросто получит EOF и не установит никаких переменных.

Если вы хотите, чтобы readвсегда читал с управляющего tty, то явно перенаправьте его:

read var </dev/tty

Это также следует использовать с осторожностью.Никто не оценит вас, если им придется использовать expect(1)для инструментирования вашего скрипта.

3
28.01.2020, 02:22

Теги

Похожие вопросы