почему перенаправление (<) не создает подоболочку - PullRequest
3 голосов
/ 28 июня 2011

Я написал следующий код

var=0
cat $file | while read line do
    var=$line
done
echo $var

Теперь, насколько я понимаю, труба (|) вызовет создание подоболочки, поэтому переменная var в строке 1 будет иметь то же значение впоследняя строка.

Однако это решит эту проблему:

var=0
while read line do
    var=$line
done < $file
echo $line

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

Спасибо

Ответы [ 2 ]

13 голосов
/ 28 июня 2011

Команда cat - это команда, которая означает, что ей нужен собственный процесс, и она имеет свои собственные STDIN и STDOUT. В основном вы берете STDOUT, созданный командой cat, и перенаправляете его в процесс цикла while.

Когда вы используете перенаправление, вы не используете отдельный процесс. Вместо этого вы просто перенаправляете STDIN цикла while из консоли в строки файла.

Излишне говорить, что второй способ более эффективен. В старом Usenet днях до того, как все вы, маленькие хулиганы, завладели нашим Интернетом (_Дорогие вы, дети! Уходите из моего Интернета!) И уничтожили его с помощью вашей причудливой графики и всех этих веб-страниц, некоторые люди используют вручить премию Бесполезное использование Cat людям, которые внесли свой вклад в группу comp.unix.shell и имели поддельную команду cat, поскольку использование cat практически никогда не требуется и обычно более неэффективен.

Если вы используете cat в своем коде, вам, вероятно, это не нужно. Команда cat поступает из объединения, и предполагается, что она используется только для объединения файлов. Например, когда мы используем SneakerNet на дискетах по 800 КБ, нам придется разделять длинные файлы с помощью команды Unix split , а затем использовать cat для объединения их вместе.

2 голосов
/ 28 июня 2011

Существует канал для подключения стандартного вывода одной программы к стандартному или другому.Два процесса, возможно, две оболочки.Когда вы делаете перенаправление (> и <), все, что вы делаете, это переназначение stdin (или stdout) в файл.чтение / запись файла может выполняться без другого процесса или оболочки.

...