#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2
не выводит, потому что конвейеры запускают каждый из своих компонентов внутри подоболочки. Подоболочки наследуют копии переменных родительской оболочки, а не разделяют их. Попробуйте это:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
(
echo $foo
foo="foo contents modified"
echo $foo
)
echo $foo
Скобки определяют область кода, которая запускается в подоболочке, и $ foo сохраняет свое первоначальное значение после изменения внутри них.
Теперь попробуйте это:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
{
echo $foo
foo="foo contents modified"
echo $foo
}
echo $foo
Скобки предназначены исключительно для группировки, подоболочка не создается, а $ foo, модифицированный внутри скобок, - это тот же $ foo, модифицированный вне их.
Теперь попробуйте это:
#!/bin/sh
echo "hello world" | {
read var1 var2
echo $var1
echo $var2
}
echo $var1
echo $var2
Внутри фигурных скобок встроенное чтение правильно создает $ var1 и $ var2, и вы можете видеть, что они отражаются. За пределами фигурных скобок они больше не существуют. Весь код в фигурных скобках был выполнен в подоболочке , потому что это один компонент конвейера .
Вы можете помещать произвольные объемы кода между фигурными скобками, поэтому вы можете использовать эту конструкцию piping-in-block всякий раз, когда вам нужно запустить блок сценария оболочки, который анализирует выходные данные чего-то еще.