LINUX.ORG.RU

Конвеер в bash и zsh.


0

1

Привет всем форумчанам LOR'а.

Принаписании совершенного обычного скрипта на bash столкнулся с непонятной мне странностью. Пусть скрипт выглядит следующим образом: #!/bin/bash

echo -n «Input floop variable value: »

read hello

export FLOOP=$hello

как видно ничего нетривиального. Просто считываем значение переменной со стандартного ввода и записываем его в переменную FLOOP. Если запустить его в командной строке вот так: $ ./floop.sh то разумеется переменная FLOOP будет экспортирована внутри скрипта, если запустить так: $ . ./floop.sh или $ source ./floop.sh то переменная нормально экспортируется для текущей сессии bash. Здесь все ясно.

Но если запустить вот так: $ echo «hello» | source ./floop.sh или $ echo «hello» | . ./floop.sh то никакой переменной в экспорте не будет и «echo $FLOOP» выдаст пустую строку.

Но вот что странно. В zsh последнии две команды работают как надо и переменная FLOOP содержит строку «hello» после их выполнения.

Так в чем же отличие конвеера в bash и zsh? Или я просто что-то не так делаю? Пытался найти ответ в google, но без результатно. Есть идеи?


просто bash правую часть форкает, а zsh не форкает. Это особенность реализации zsh.

В zsh последнии две команды работают как надо

кому надо? :)

anonymous
()

fancer

ничего нетривиального

man понятие тривиальность // вы его используете в противоположном смысле

do0dlez ★★
()

«Тривиальный» - это простой, не обладающий сложностью.
«Нетривиальный» - это нечто сложное, необычное и тд.
«Ничего нетривиального» - отсутсвие нетривиального, то есть отсутсвие чего-то сложного, необычного.
А согласитесь скрипт действительно простой. Так что по-моему все в порядке и здесь это слово употребляется правильно. Двойное отицание в русском языке дело такое, не всегда понятно, что имелось ввиду.)

«как надо» - выражение используется в смысле получения ожидаемого результата. Например, «Это устройство работает как надо.» То есть мы ожидаем от простого скрипта того, чтобы он модифицировал переменные окружения в результате работы с конвейером.

Анонимусам спасибо за разьяснение.) Я правильно понял?

bash - форкает и создает два процесса - команда слева и справа, после этого соединяет стандартный вывод процесса, соответствующего левой команде, со стандартным вводом процесса правой команды?

zsh - запускает их поочереди, накапливая где-то у себя все данные со стандартного вывода процесса команды слева и затем передает их на стандартный ввод процесса правой команды?

Но из этого все равно не совсем понятно, почему для bash - перменные не устанавливаются, а для zsh - устанавливаются. Дело в двойном форке?
Объясните по конкретнее, пожалуйста!

fancer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.