Когда вы создаете онлайн-уроки для людей, которые могут использовать их в одном терминале, иногда приятно иметь встроенный код... однако ни один из них не работал так, как я ожидал. Я ожидал, foo
что для всех них будет "bar". Кто-нибудь знает, почему?
#!/usr/bin/env bash
source <(echo "export foo=bar");
echo "$foo"
source <(cat <<< "export foo=bar");
echo "$foo"
source <(cat <<EOF
export foo=bar
EOF
);
echo "$foo"
Моя единственная догадка, что source
не может читать из файлового дескриптора? Я также пробовал использовать .
вместо source
того же самого.
Я на MacOS, bash --version
вывод:
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18) Copyright (C) 2007 Free Software Foundation, Inc.
решение1
Это не будет работать в bash
версиях до версии 4.0 (например, в версии по умолчанию bash
в macOS 3.2.57(1)).
В версии 4.0 была исправлена ошибка:
Исправлена ошибка, из-за которой `.' не мог читать и выполнять команды из необычных файлов, таких как устройства или именованные каналы.
(это изhttps://tiswww.case.edu/php/chet/bash/ИЗМЕНЕНИЯ)
Файл, считываемый source
(или .
), когда вы используете его с подстановкой процесса, не является обычным файлом, поэтому он может вызвать ошибку, исправленную в версии 4.0.
Последней версией на данный момент является версия 5.0.7(1), в которой ваш код работает так, как и ожидалось.