#!/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 правильно, и вы можете видеть, что они получают эхо. Вне брекетов они больше не существуют. Весь код в фигурных скобках был запущен в подоболочке , потому что это один из компонентов конвейера.
Вы можете поместить произвольное количество кода между фигурными скобками, чтобы вы могли использовать эту конструкцию трубопроводов в блок, когда вам нужно запустить блок сценария оболочки, который анализирует вывод чего-то еще.
Это зависит от выбора оболочки. Ksh93 был разработан для ограничения производственных расходов.Он также запускает конечный элемент конвейера * внутри * вызывающего процесса оболочки, тем самым сохраняя состояние. – 2012-07-26 09:49:52
Bash 4.2 представила возможность сделать то же самое. Отключите управление заданиями (`set + m`) и установите опцию` lastpipe` (`shopt -s lastpipe`). – chepner 2012-07-26 12:10:02
Я займусь этим. Благодаря! – 2012-07-31 14:32:51