Использование канала не позволяет левому процессу экспортировать переменные. Зачем? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующий однострочный файл bash foo.sh:

export PATH=<new path>

В другом скрипте я использую:

echo $PATH # --> old path
. foo.sh | grep bar
echo $PATH # --> old path!!!!

В зависимости от компьютера, на котором я выполняю этот второй скриптвключено, PATH обновляется или не обновляется в основном скрипте.На машинах, где он не работает, какой бы ни была команда справа от канала, она все равно не работает.Напротив, если я уроню трубку, она всегда будет работать независимо от машины.

Предполагается, что мои машины имеют одинаковую конфигурацию (хотя, учитывая эту проблему, похоже, что они этого не делают),Версия Bash - 4.1.2.

Есть ли у вас какие-либо идеи, где / что искать, чтобы понять это поведение?

1 Ответ

0 голосов
/ 15 мая 2018

В bash все части конвейера выполняются в отдельных подоболочках, поэтому использование сценария не меняет путь.

Некоторые оболочки могут работатькоманда last в текущей среде оболочки (например, ksh93), но bash - нет (если только управление заданиями не отключено и не включена опция оболочки lastpipe, а конвейер невыполняется в фоновом режиме).

В ручном режиме bash в разделе "Конвейеры" указано

Каждая команда в конвейере выполняется как отдельный процесс (т. е. впополам)

1018 *
...