6

Я хотел бы source файла и переадресовать STDIN для этого источника. Является ли это возможным?

Например, у меня есть этот файл, который я хочу получить:

# test.sh
export VALUE=SOMETHING

Это работает в оболочке:

> source test.sh
> echo $VALUE
SOMETHING
>

Все же это не работает

> echo anything | source test.sh
> echo $VALUE

>

Есть ли какой-то способ, которым это может быть сделано, или это потому, что "источник" работает в текущей оболочке, что он не может временно перенаправить STDIN?

1 ответ1

11

Есть веская причина, почему это не работает:

echo anything | source test.sh

Это потому, что вышеупомянутое является трубопроводом. Следовательно, source test.sh работает в подоболочке. Это означает, что любые переменные среды, которые он создает, отбрасываются, когда его выполнение завершается.

Решение вашей проблемы:

 source test.sh < <(echo anything)

При таком подходе source test.sh запускается в основной оболочке. Его стандартный ввод перенаправляется из echo anything используя подстановку процесса.

Первый < перенаправляет стандартный ввод. Второе < является частью конструкции <(...) которая создает подстановку процесса. По крайней мере, один пробел между первым и вторым < требуется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .