Как указывали другие, читатель канала получает EOF, когда не осталось писателей. Таким образом, решение состоит в том, чтобы убедиться, что всегда есть один писатель, который держит его открытым. Этому писателю не нужно ничего посылать, просто держите его открытым.
Поскольку вы используете сценарий оболочки, самое простое решение — указать оболочке открыть канал для записи. А затем закройте его, когда закончите.
#!/bin/sh
mkfifo P
exec 3>P # open file descriptor 3 writing to the pipe
program < P
# < P tail -n +1 -f | program
echo some stuff > P
cat more_stuff.txt > P
exec 3>&- # close file descriptor 3
Обратите внимание, что если вы пропустите последнюю строку, файловый дескриптор 3 будет автоматически закрыт (и, таким образом, считыватель получит EOF) при выходе из скрипта. Помимо удобства, это также обеспечивает своего рода безопасность, если сценарий каким-то образом завершится раньше.
Утилита host
вернет строку, содержащую разрешенное имя хоста:
$ host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com.
Это должно быть довольно легко разобрать в любом сценарии оболочки. Если поиск имени хоста не удался, host
завершается с ненулевым статусом выхода:
$ if ! host 8.8.8.1 2>/dev/null; then echo "lookup failed"; fi
lookup failed
Эта утилита является частью пакета bind-tools
в Arch Linux.
Вы можете использовать либо host
, либо nslookup
из bind-tools
:
$ host 172.217.19.195
195.19.217.172.in-addr.arpa domain name pointer fra02s21-in-f3.1e100.net.
$ nslookup 172.217.19.195
Server: 192.168.2.1
Address: 192.168.2.1#53
Non-authoritative answer:
195.19.217.172.in-addr.arpa name = fra02s21-in-f3.1e100.net.