Используйте чтение удара, встроенное без некоторое время цикла

Вы проверяли свои серверы имен? Один или два сопоставителя DNS сверху/etc/resolv.conf файла недоступно по некоторым причинам?

grep ^nameserver /etc/resolv.conf

попытайтесь проверить с помощью ping-запросов IP-адреса серверов имен. По всей вероятности лучший не собирается отвечать, которого Вы ожидаете в течение 30 секунд к тайм-ауту. Следовательно задержка Ваших 30 секунд. Если Вы - администратор сервера, т.е. имеете корневой доступ, или удаляете этот сервер имен или снижаете его для становления более низкой важностью.

7
12.02.2015, 06:14
3 ответа

Это потому, что переменные используются в новом наборе команд. Используйте вместо этого:

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 вы можете обойти это поведение с помощью группировки команд {} , подстановки процессов ( <<() ) или здесь строк ( <<< ).

8
27.01.2020, 20:16

Цитирую очень полезную статью wiki.bash-hackers.org:

Это потому, что команды трубки выполняются в подоболочках, которые не могут изменить родительскую оболочку. В результате, переменные родительской оболочки не изменяются (см. статью: Bash и дерево процессов).

Так как ответ был предоставлен несколько раз, альтернативный способ (с помощью не встроенных команд...) это:

$ eval `echo 0 1 | awk '{print "A="$1";B="$2}'`;echo $B $A
$ 1 0
3
27.01.2020, 20:16

Как вы отмечали, проблема заключалась в том, что труба к прочитана пропускается в подоболочке.

Один из ответов - использовать heredoc:

numbers="01 02"
read first second <<INPUT
$numbers
INPUT
echo $first
echo $second

Этот метод хорош тем, что он будет вести себя так же, как и в любой POSIX-подобной оболочке.

0
27.01.2020, 20:16

Теги

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