Почему “нечто эха |, читает a; $a эха”, не работающий как ожидалось?

Если вы вручную запускаете Docker-контейнер с помощью nginx с портом 80, отображаемым как некоторый локальный порт, работает ли он при переходе к / anypath? У вас есть доступ к журналам доступа nginx из вашего модуля?

7
задан Jonathan Leffler 17 December 2008 в 15:37
поделиться

7 ответов

Из-за передачи по каналу read выполняется в его собственной подоболочке.

echo foo | while read a; do echo $a; done

сделает то, к чему Вы ожидаете это.

14
ответ дан 6 December 2019 в 07:30
поделиться

альтернатива:

echo foo | (read a ; echo $a)

Править:

При необходимости в $a вне подоболочки необходимо инвертировать команды:

read a < <(echo foo); echo $a

этим путем чтение выполняется в текущем процессе

6
ответ дан 6 December 2019 в 07:30
поделиться

Я не думаю, что этому уже дали:

a=`echo foo`
echo $a
3
ответ дан 6 December 2019 в 07:30
поделиться

Просто к вашему сведению; в ksh это работает как ожидалось; См. также http://kornshell.com/doc/faq.html, Раздел III (вопросы о программировании оболочки), Q13:

Q13.    What is $bar after, echo foo | read bar?
A13.    The is foo.  ksh runs the last component of a pipeline
        in the current process.  Some shells run it as a subshell
        as if you had invoked it as  echo foo | (read bar).
3
ответ дан 6 December 2019 в 07:30
поделиться

Я предложил решение, которое не скрывает значения переменных в подоболочке, и это может также работать с несколькими значениями.

set `echo foo bar`
A=$1
B=$2
0
ответ дан 6 December 2019 в 07:30
поделиться

По словам Kernighan и Пика Среда программирования Unix (p. 159) "ни одна из оболочки встроенные команды (в противоположность примитивам потока управления, как для) могут быть перенаправлены с> и <", и "это могло бы быть описано как ошибка в оболочке". Это, кажется, объясняет a) почему код как

ls *.c |
while read file
do
   echo $a
done

неизменно работы без проблемы и b) несоответствие, что перенаправление из файла работает.

-1
ответ дан 6 December 2019 в 07:30
поделиться

читайте ожидает вход на новой строке

while read a; do echo $a; done
foo
bar
^D

более или менее, что Вы хотели

-2
ответ дан 6 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

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