Вы проверяли свои серверы имен? Один или два сопоставителя DNS сверху/etc/resolv.conf файла недоступно по некоторым причинам?
grep ^nameserver /etc/resolv.conf
попытайтесь проверить с помощью ping-запросов IP-адреса серверов имен. По всей вероятности лучший не собирается отвечать, которого Вы ожидаете в течение 30 секунд к тайм-ауту. Следовательно задержка Ваших 30 секунд. Если Вы - администратор сервера, т.е. имеете корневой доступ, или удаляете этот сервер имен или снижаете его для становления более низкой важностью.
Это потому, что переменные используются в новом наборе команд. Используйте вместо этого:
head somefile | { read A B C D E FOO; echo $A $B $C $D $E $FOO; }
Обратите внимание, что в этом синтаксисе должен быть пробел после {
и ;
(точка с запятой) перед }
.
Также -n1
не требуется; read
читает только первую строку.
Для лучшего понимания это может вам помочь; он делает то же самое, что и выше:
read A B C D E FOO < <(head somefile); echo $A $B $C $D $E $FOO
Редактировать:
Часто говорят, что следующие два оператора делают то же самое:
head somefile | read A B C D E FOO
read A B C D E FOO < <(head somefile)
Ну, не совсем. Первый - это канал от head
к bash
read
встроенной. Стандартный вывод одного процесса на стандартный ввод другого.
Второй оператор - это перенаправление и подстановка процесса. Он обрабатывается самим bash
. Он создает FIFO (именованный канал, <(...)
), к которому подключен вывод head
, и перенаправляет ( <
) его на читает процесс
.
Пока они кажутся эквивалентными. Но при работе с переменными это может иметь значение. В первом после выполнения переменные не устанавливаются. Во втором они доступны в текущем окружении.
В этой ситуации у каждой оболочки свое поведение. См. ссылку , для которой они предназначены. В bash
вы можете обойти это поведение с помощью группировки команд {}
, подстановки процессов ( <<()
) или здесь строк ( <<<
).
Цитирую очень полезную статью wiki.bash-hackers.org:
Это потому, что команды трубки выполняются в подоболочках, которые не могут изменить родительскую оболочку. В результате, переменные родительской оболочки не изменяются (см. статью: Bash и дерево процессов).
Так как ответ был предоставлен несколько раз, альтернативный способ (с помощью не встроенных команд...) это:
$ eval `echo 0 1 | awk '{print "A="$1";B="$2}'`;echo $B $A
$ 1 0
Как вы отмечали, проблема заключалась в том, что труба к прочитана
пропускается в подоболочке.
Один из ответов - использовать heredoc:
numbers="01 02"
read first second <<INPUT
$numbers
INPUT
echo $first
echo $second
Этот метод хорош тем, что он будет вести себя так же, как и в любой POSIX-подобной оболочке.